Cocos2dx 小技巧(十六)再谈visit(getDescription)
在非常久非常久曾经。我用写过一篇博客,关于怎样查看CCArray与CCDictionary里存放的元素:http://blog.csdn.net/star530/article/details/23877429
如今既然它俩已经都是过去式了,那么之前的查看方法肯定也是不能用了。
而Value作为它们的替代者之中的一个。自然也有它查看元素的方法。那就是getDescription()这个接口,以下我简单举个样例:
Value a(10);
std::string a_str = a.getDescription();
CCLOG("a = %s",a_str.c_str());//打印出 a 相应的值
以下看下程序执行结果。输出例如以下信息:
看输出好像没什么问题。但这里有个疑问。为什么 a = 与 10没有在同一行呢?
在getDescription()这个接口里。究竟发生了慘绝人寰的事?带着疑问与好奇,我们到getDescription()的定义里一探虚实。
std::string Value::getDescription()
{
std::string ret("\n");//插入换行符
ret += visit(*this, 0);
return ret;
}
看完代码才发现,原来在返回的字符串里先插入一个 "\n" 换行符。
我们的故事本来到这里应该结束了,但总有些强迫症的孩子心里有点疙瘩。既然都看到这了,干嘛不再看看 visit(*this, 0) 这个函数都做了些什么呢?
好吧,既然你都这样求我了。那...我们继续往下看:
static std::string visit(const Value& v, int depth)
{
std::stringstream ret;//创建一个字符串流 //推断Value内元素的类型
switch (v.getType())
{
case Value::Type::NONE:
case Value::Type::BYTE:
case Value::Type::INTEGER:
case Value::Type::FLOAT:
case Value::Type::DOUBLE:
case Value::Type::BOOLEAN:
case Value::Type::STRING:
ret << v.asString() << "\n";//假设是上面这几种类型,那么直接将其转换成string型就可以。
break;
case Value::Type::VECTOR:
ret << visitVector(v.asValueVector(), depth);
break;
case Value::Type::MAP:
ret << visitMap(v.asValueMap(), depth);
break;
case Value::Type::INT_KEY_MAP:
ret << visitMap(v.asIntKeyMap(), depth);
break;
default:
CCASSERT(false, "Invalid type!");
break;
} return ret.str();
}
上述代码我没有做过多的凝视。我们仅仅要注意两点:
1、普通的数据类型,如int。string等,能够直接转成string型(asString())后放入ret流中就可以。
而假设元素类型是Vector或者Map,则须要做进一步的处理;
2、visit(const Value& v, int depth) 这个函数的第二个參数 depth是个什么玩意?眼尖的我发现进一步处理Vector类型的元素时。调用到visitMap(v.asValueMap(), depth)这个函数。而depth正好是该函数的第二个參数。
带着疑惑,我们继续:
static std::string visitVector(const ValueVector& v, int depth)
{
std::stringstream ret; if (depth > 0)
ret << "\n"; ret << getTabs(depth) << "[\n"; int i = 0;
for (const auto& child : v)
{
ret << getTabs(depth+1) << i << ": " << visit(child, depth + 1);//在这里读取Vector中的元素
++i;
} ret << getTabs(depth) << "]\n"; return ret.str();
}
这函数乍看一下有点莫名其妙。事实上我们仅仅要知道getTabs(int depth)这个函数是怎么回事就能够,其它自然迎刃而解。
static std::string getTabs(int depth)
{
std::string tabWidth; for (int i = 0; i < depth; ++i)
{
tabWidth += "\t";//插入一个制表符
} return tabWidth;
}
原来getTabs()的功能就是插入制表符啊(所谓制表符就是tab键)。而传入的參数depth是多少就加入多少个制表符。
好了。流程就是这样子。我想非常多人如今脑袋瓜子都还蒙蒙的。没事。以下我举个栗子,然后小伙伴们依据程序的输出结果与上面提到的visit()、visitVector()的代码參照下。
Value a(10);
Value b("star is so cool");
ValueVector star_vec;
star_vec.push_back(a);
star_vec.push_back(b);
//将ValueVector类型转成Value类型才可调用getDescription()
std::string star_str = ( (Value)star_vec ).getDescription();
CCLOG("-----------------------");
CCLOG("%s",star_str.c_str());
CCLOG("-----------------------");
程序执行后。输出结果例如以下:
好了,就酱紫吧。能不能理解就看阁下的悟性了。
尊重原创,转载请注明来源:http://blog.csdn.net/star530/article/details/38071517
Cocos2dx 小技巧(十六)再谈visit(getDescription)的更多相关文章
- Python基础篇 -- 小数据池和再谈编码
小数据池 1. id() 通过id()可以查看到一个变量表示的值在内存中的地址 s = "Agoni" print(id(s)) # 2410961093272 2. is 和 = ...
- Eclipse用法和技巧十六:自动添加未实现方法2
前面一篇文章里面介绍了一种常见的自动添加未实现函数的方法.这里在顺便补充几个方法.第一个方法,看上去有点怪怪的: 步骤一:Source > Clean Up: 步骤二:选择cust ...
- Cocos2dx 小技巧(十五)话说ScrollView的delegate实现过程
附:本文參加了CSDN博客大赛.亲假设认为这篇文章不错,就大胆的来投上一票吧! !!http://vote.blog.csdn.net/Article/Details? articleid=34140 ...
- Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式
今早发生了一件事让我感觉特气愤!去年的这个时候,我和小伙伴们一起在操场上拍毕业照,之后有个当地报纸的记者来我们学校取材,看到我们后打算给我们拍几张创意张扬点的毕业照.之后呢,照片出来了,拍的效果大伙都 ...
- Cocos2dx 小技巧(十四)ScrollView实现缩放效果
这阶段心绪比較乱,所以这篇开头就不扯淡了.(谁说大姨夫来了我跟谁急!~~)说到大姨夫我突然想到英雄联盟有个美女讲解叫伊芙蕾亚,她的堂弟ID居然叫:姨夫累呀,好笑吧(呵呵,有点冷~~额,我都说不扯淡了) ...
- Cocos2dx 小技巧(十三)聊聊坐标系
一好友考上了空姐.她说:以后基本上不会回来了.等下次见面时请叫我白富美!尽管有点羡慕.但我依然不甘示弱回复:下次见面时请叫我高富帅! 未来,谁说得准呢? ------------------有段时间没 ...
- Cocos2dx 小技巧(十一) 小人虽短,但能够旋转
转眼五一就到了,放假三天应该做些什么呢?窝在家里钻研技术?写博客?no no no no,这样的"伤害"自己的方式实在让我无法忍受.本来和大学那伙人越好了一起去哪里玩玩,喝酒聊天啥 ...
- 【cocos2dx 小技巧】半透明屏蔽罩和弹出框的实现
今天介绍一下,弹出框的和屏蔽罩的小实现~ 弹出框主要用到了cocos2dx生命周期里面的OnEnter()函数,就是当Layer被addChild的时候会调用的函数(所以假设把OnEnter的代码加到 ...
- OpenCV学习笔记(四十)——再谈OpenCV数据结构Mat详解
原文:http://blog.csdn.net/yang_xian521/article/details/7107786 我记得开始接触OpenCV就是因为一个算法里面需要2维动态数组,那时候看cor ...
随机推荐
- css选择器和优先级总结
本文转自http://www.cnblogs.com/zxjwlh/p/6213239.html CSS三大特性—— 继承. 优先级和层叠. 继承:即子类元素继承父类的样式; 优先级:是指不同类别样式 ...
- [置顶]
Docker学习总结(2)——Docker实战之入门以及Dockerfile(二)
csphere/php-fpm:5.4 # cd docker-training/php-fpm/ # ls Dockerfile nginx_nginx.conf supervisor_nginx. ...
- 项目EasyUi和JS中遇到的问题总汇
近期因为项目用到EasyUi,曾经仅仅是听过,可是没有详细用过.仅仅能一边学一边做.如今将做的过程中遇到的一些难点总结例如以下,以备后用: EsayUi使用: Json格式:key:value,key ...
- highcharts 阶梯图表并填充颜色(自己觉得:直角折线图表)
例如以下:普通阶梯图 $(function () { $('#container').highcharts({ title: { text: '普通阶梯图' ...
- ReactNavtive框架教程(4)
开头的响应码, 这些代码都很实用. 比如202 和 200表示返回一个推荐位置的列表.当完毕这个实例后.你能够尝试处理这些返回码.并将列表提供给用户选择. 保存,返回模拟器,按下Cmd+R ,然后搜索 ...
- 2. APIS官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ 2. APIS .APIS Apache Kafka引入一个新的java客户端(在o ...
- asp.net 查询sql数据表的网页模板
最近因为工作需求,要制作一个网页模板,主要是用于快速开发,可以查询Sql数据表信息的模板, 昨天做好了,这个只是一个Demo,但是功能已经齐全了, 开发新的网站时,需要新增一个xml,复制粘贴网页的前 ...
- zico源代码分析(二) 数据读取和解析部分
第一部分:分析篇 首先,看一下zico的页面,左侧是hostname panel,右侧是该主机对应的traces panel. 点击左侧zorka主机名,右侧panel会更新信息,在火狐浏览器中使用f ...
- 含有过滤功能的android流式布局
FilterFlowLayout 含有过滤功能的流式布局, 參考FlowLayout 能够去除宽度不在范围(比例或真实值)内的子view 能够设置最大行数 能够加入组件间水平间距 能够加入行间距 系统 ...
- ubuntu-系统卡慢解决(转载)
ubuntu系统狠慢 或者很卡的原因 1. 涉及内存小或者虚拟SWAP分区调整问题 可以通过 系统监视器 进行查看 在UBUNTU系统里面,并不是你的物理内存全部耗尽之后,系统才使用 ...