cocos2dx 3.0的value等

最近看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++却不行,如果使用需要声明或者把使用的代码放在类型的定义后面。


来自为知笔记(Wiz)


你可能感兴趣的:(cocos2dx 3.0的value等)