Cocos2dx 小技巧(十六)再谈visit(getDescription)
来源:互联网 发布:iphone7无法删除软件 编辑:程序博客网 时间:2024/04/30 05:24
之前两篇都是介绍与Value相关的,这篇我继续这个话题吧,正好凑个“Value三板斧系列...”。
在很久很久以前,我用写过一篇博客,关于如何查看CCArray与CCDictionary里存放的元素:http://blog.csdn.net/star530/article/details/23877429
现在既然它俩已经都是过去式了,那么之前的查看方法肯定也是不能用了。而Value作为它们的替代者之一,自然也有它查看元素的方法,那就是getDescription()这个接口,下面我简单举个例子:
看输出好像没什么问题,但这里有个疑问,为什么 a = 与 10没有在同一行呢?
在getDescription()这个接口里,到底发生了惨绝人寰的事?带着疑问与好奇,我们到getDescription()的定义里一探虚实。
我们的故事本来到这里应该结束了,但总有些强迫症的孩子心里有点疙瘩,既然都看到这了,干嘛不再看看 visit(*this, 0) 这个函数都做了些什么呢?
好吧,既然你都这样求我了,那...我们继续往下看:
1、普通的数据类型,如int,string等,可以直接转成string型(asString())后放入ret流中即可。而如果元素类型是Vector或者Map,则需要做进一步的处理;
2、visit(const Value& v, int depth) 这个函数的第二个参数 depth是个什么玩意?眼尖的我发现进一步处理Vector类型的元素时,调用到visitMap(v.asValueMap(), depth)这个函数,而depth正好是该函数的第二个参数。
带着疑惑,我们继续:
好了,流程就是这样子,我想很多人现在脑袋瓜子都还蒙蒙的,没事,下面我举个栗子,然后小伙伴们根据程序的输出结果与上面提到的visit()、visitVector()的代码参照下。
好了,就酱紫吧,能不能理解就看阁下的悟性了。
尊重原创,转载请注明来源:http://blog.csdn.net/star530/article/details/38071517
在很久很久以前,我用写过一篇博客,关于如何查看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
18 3
- Cocos2dx 小技巧(十六)再谈visit(getDescription)
- [置顶] Cocos2dx 小技巧(十六)再谈visit(getDescription)
- Cocos2dx 小技巧(八) visit的逆袭
- Cocos2dx 小技巧(八) visit的逆袭
- Cocos2dx 小技巧(八) visit的逆袭
- Cocos2dx 小技巧(二)单例
- Cocos2dx 小技巧(四)delegate委托
- Cocos2dx 小技巧(六)断言CCAssert
- Cocos2dx 小技巧(七) 静态数据
- Cocos2dx 小技巧(二)单例
- Cocos2dx 小技巧(四)delegate委托
- Cocos2dx 小技巧(六)断言CCAssert
- Cocos2dx 小技巧(七) 静态数据
- Cocos2dx 小技巧(十三)聊聊坐标系
- Cocos2dx 小技巧(六)断言CCAssert
- Cocos2dx 小技巧(四)delegate委托
- Cocos2dx 小技巧(六)断言CCAssert
- Cocos2dx 小技巧(七) 静态数据
- 初识flex
- haslayout 以及怎样触发haslayout? 在什么情况下需要触发haslayout
- cocos2dx粒子效果的一个有趣的bug
- Oracle导入数据
- POJ 2342
- Cocos2dx 小技巧(十六)再谈visit(getDescription)
- 持续集成(一)思想篇
- Uva10673 Play with Floor and Ceil(拓展欧几里得)
- 数据挖掘分类算法的优缺点总结
- 文件的删除
- Android四大基本组件介绍与生命周期
- Android_Zip解压缩工具
- 菜鸟求教到底错哪了
- Oracle Metalink Notes Collection