在CCValue.h中一开始就声明了:
typedef std::vector<Value> ValueVector;
typedef std::unordered_map<std::string, Value> ValueMap;
typedef std::unordered_map<int, Value> ValueMapIntKey;
extern const ValueVector ValueVectorNull;
extern const ValueMap ValueMapNull;
extern const ValueMapIntKey ValueMapIntKeyNull;
这个有个c++的语法点:c++中const的修饰的全局常量具有内部链接性。const可以与extern连用来声明该常量的
链接性
为全局。
在Value对象的构造函数里面可以用很多数据类型进行初始化,这让我很好奇,难道有很多的私有成员吗?毕竟它没有使用泛型。原来它包含了一个union类型,公用内存的一个类型。
union
{
unsigned char byteVal;
int intVal;
float floatVal;
double doubleVal;
bool boolVal;
std::string* strVal;
ValueVector* vectorVal;
ValueMap* mapVal;
ValueMapIntKey* intKeyMapVal;
}_field;
Type _type;
这里就明白他构造函数可以用不同的数据类型初始化的原因。 _type用来记录初始化的数据类型。
enum class Type
{
NONE = 0,
BYTE,
INTEGER,
FLOAT,
DOUBLE,
BOOLEAN,
STRING,
VECTOR,
MAP,
INT_KEY_MAP
};
c++11的新语法 enum class。不清楚和enum的区别。 唯一的感觉就是是个强类型的了,不能转成整数了,以前的enum就是一个整数。
简单的看下它的构造函数
Value::Value(unsigned char v)
: _type(Type::BYTE)
{
_field.byteVal = v;
}
它还定义了重载了赋值操作符号。
Value v1=Value:Null;
v1=3; 该操作调用赋值构造函数
但是
Value v2=3;这样就不行 改操作应该调用构造函数
还有一个地方,通过这个类我也学会了C++的前置声明。
在CCValue.h的开头使用了Class Value;
按照Java的语法,同一个文件后面声明的类型,前面可以直接使用,C++却不行,如果使用需要声明或者把使用的代码放在类型的定义后面。