cocos2dx标准容器_Cocos2d-x3.0模版容器详解之三:cocos2d::Value
1.概述
版本: v3.0 beta
語言: C++
定義在 “COCOS2DX_ROOT/cocos/base” 路徑下的 "CCValue.h" 的頭文件中。
class?Value;
unioncocos2d::Valie 是一個包含了很多原生類型(int,float,double,bool,unsigned char,char* 和 std::string)外加 std::vector, std::unordered_map<:string> 和 std::unordered_map 的類。
你可以把所有上面的提及的原生類型放入 cocos2d::Value 對象中,然后將它們轉化為對應的原生類型,反之亦然。
在內部,cocos2d::Value 使用了一個聯合變量來保存各種原生類型,這樣可以節省很多的內存空間。
在 Cocos2d-x v3.0 beta 之前,存在著一些原生類型的封裝類,如 CCBool, CCFloat, CCDouble, CCinteger,這些將會被棄用。
注意:當你在處理原生類型和容器的時候,請使用 cocos2d::Vector,cocos2d::Map 和 cocos2d::Value。
2.內存管理
cocos2d::Value 的內存是由它自己的析構函數自動處理的。所以當處理 cocos2d::Value 的內存時請堅持以 c++ 內存管理規則進行最佳實踐。
cocos2d::Value 類包含了以下的數據成員:
{
unsigned?char?byteVal;
int?intVal;
float?floatVal;
double?doubleVal;
bool?boolVal;
}_baseData;
std::string?_strData;
ValueVector*?_vectorData;
ValueMap*?_mapData;
ValueMapIntKey*?_intKeyMapData;
Type?_type;
從代碼片段可以看到,_baseData,_strData 和 _type 數據成員的內存是由編譯器和她們的析構函數自動處理的。cocos2d::Value 的析構函數負責釋放所有指針成員變量的資源(_vectorData,_mapData 和 _intKeyMapData)。
警告:cocos2d::Value 不再像其他的 cocos2d 類一樣使用 retain/release和引用計數內存管理。
3.基本用法
cocos2d::Value 的用法是非常簡單的。
這里提供一個簡單的示例:
Value?val;???????????????//?調用默認構造函數
if(val.isNull())
{
log("val?is?null");
}
else{
std::string?str?=val.getDescription();
log("The?description?of?val0:%s",str.c_str());
}
//----------------------------------------------------
Value?val1(65);???????????????//?用一個?int?初始化
//Value?val1(3.4f);???//?用一個?float?初始化
//Value?val1(3.5);???//?用一個?double?初始化
log("The?description?of?the?integer?value:%s"?,val1.getDescription().c_str());
log("val1.asByte()?=?%c"?,val1.asByte());
//----------------------------------------------------
std::string?strV?=?"string";
Value?val2(strV);???????????????//?用?string?初始化
log("The?description?of?the?string?value:%s"?,val2.getDescription().c_str());
//----------------------------------------------------
auto?sp0?=?Sprite::create();
Vector*?vecV?=?new?Vector();
vecV->pushBack(sp0);
Value?val3(vecV);???????????????//?用?Vector?初始化
log("The?description?of?the?Vector?value:%s"?,val3.getDescription().c_str());
delete?vecV;
//----------------------------------------------------
Map<:string>*?mapV?=?new?Map<:string>();
mapV->insert(strV,sp0);
Value?val4(mapV);???????????????//?用?Map?初始化
log("The?description?of?the?Map?value:%s"?,val4.getDescription().c_str());
delete?mapV;
//----------------------------------------------------
Value?val6(&val4);???????????????//?用?Map?初始化
log("The?description?of?the?Value-type?value:%s"?,val6.getDescription().c_str());
//----------------------------------------------------
val2?=?val1;???????????????//?在兩個不同指類型間賦值
log("operator->?The?description?of?val2:%s"?,val2.getDescription().c_str());
val2?=?4;???????????????//?直接賦值
log("operator->?The?description?of?val4:%s"?,val2.getDescription().c_str());
輸出:
cocos2d:?val?is?null
cocos2d:?The?description?of?the?integer?value:
65
cocos2d:?val1.asByte()?=?A
cocos2d:?The?description?of?the?string?value:
string
cocos2d:?The?description?of?the?Vector?value:
true
cocos2d:?The?description?of?the?Map?value:
true
cocos2d:?The?description?of?the?Value-type?value:
true
cocos2d:?????????????operator?????????????->?The?description?of?val2:
65
cocos2d:?????????????operator?????????????->?The?description?of?val4:
4
4.最佳實踐
偏向于使用 cocos2d::Value 和新模版容器(cocos2d::Vector 和 cocos2d::Map)而不是使用 cocos2d::CCBool,cocos2d::CCFloat,cocos2d::CCDouble,cocos2d::CCString,cocos2d::CCInteger 和舊 Objective-c 風格容器(cocos2d::CCArray 和 cocos2d::CCDictionary)。
當你想要處理原生類型集合的時候,用 cocos2d::Value 封裝原生類型,然后用新的模版容器 cocos2d::Vector 和 cocos2d::Map 組合它們。
總結
以上是生活随笔為你收集整理的cocos2dx标准容器_Cocos2d-x3.0模版容器详解之三:cocos2d::Value的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tableau双折线图_Tableau可
- 下一篇: taro 小程序转h5之后报错_记录微信