cocos2dx 3.0的value等

本文详细解读了CCValue类的构造函数和赋值操作,包括其内部实现、数据类型初始化方式及C++11新语法的应用。通过实例分析,了解了Value类型如何包容多种数据类型,并学习了C++的前置声明技巧。
最近看FileUtils里面有个方法读取plist文件转成value对象。顿时觉得这个Value类型很伟大,包容各种数据类型。所以就好好看了下这个Value的定义。
在CCValue.h中一开始就声明了:
   
  1. typedef std::vector<Value> ValueVector;
  2. typedef std::unordered_map<std::string, Value> ValueMap;
  3. typedef std::unordered_map<int, Value> ValueMapIntKey;
  4. extern const ValueVector ValueVectorNull;
  5. extern const ValueMap ValueMapNull;
  6. extern const ValueMapIntKey ValueMapIntKeyNull;
这个有个c++的语法点:c++中const的修饰的全局常量具有内部链接性。const可以与extern连用来声明该常量的 链接性 为全局。

在Value对象的构造函数里面可以用很多数据类型进行初始化,这让我很好奇,难道有很多的私有成员吗?毕竟它没有使用泛型。原来它包含了一个union类型,公用内存的一个类型。
     
  1.     union
  2.     {
  3.         unsigned char byteVal;
  4.         int intVal;
  5.         float floatVal;
  6.         double doubleVal;
  7.         bool boolVal;
  8.         std::string* strVal;
  9.         ValueVector* vectorVal;
  10.         ValueMap* mapVal;
  11.         ValueMapIntKey* intKeyMapVal;
  12.     }_field;
  13.     Type _type;
这里就明白他构造函数可以用不同的数据类型初始化的原因。 _type用来记录初始化的数据类型。
     
  1.     enum class Type
  2.     {
  3.         NONE = 0,
  4.         BYTE,
  5.         INTEGER,
  6.         FLOAT,
  7.         DOUBLE,
  8.         BOOLEAN,
  9.         STRING,
  10.         VECTOR,
  11.         MAP,
  12.         INT_KEY_MAP
  13.     };
c++11的新语法  enum class。不清楚和enum的区别。 唯一的感觉就是是个强类型的了,不能转成整数了,以前的enum就是一个整数。
简单的看下它的构造函数
      
  1. Value::Value(unsigned char v)
  2. : _type(Type::BYTE)
  3. {
  4.     _field.byteVal = v;
  5. }
它还定义了重载了赋值操作符号。

Value v1=Value:Null;
v1=3;   该操作调用赋值构造函数
但是
Value v2=3;这样就不行 改操作应该调用构造函数

还有一个地方,通过这个类我也学会了C++的前置声明。 在CCValue.h的开头使用了Class Value; 按照Java的语法,同一个文件后面声明的类型,前面可以直接使用,C++却不行,如果使用需要声明或者把使用的代码放在类型的定义后面。




转载于:https://my.oschina.net/1987times/blog/293934

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值