Cocos2d-x3.0模版容器详解之三:cocos2d::Value

1.概述

  • 版本: v3.0 beta
  • 语言: C++

定义在 “COCOS2DX_ROOT/cocos/base” 路径下的 "CCValue.h" 的头文件中。

?


1

class
Value;

cocos2d::Valie 是一个包含了很多原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外加 std::vector<Value>, std::unordered_map<std::string,Value> 和 std::unordered_map<int,Value> 的类。
你可以把所有上面的提及的原生类型放入 cocos2d::Value 对象中,然后将它们转化为对应的原生类型,反之亦然。
在内部,cocos2d::Value 使用了一个联合变量来保存各种原生类型,这样可以节省很多的内存空间。
在 Cocos2d-x v3.0 beta 之前,存在着一些原生类型的封装类,如 CCBool, CCFloat, CCDouble, CCinteger,这些将会被弃用。
注意:当你在处理原生类型和容器的时候,请使用 cocos2d::Vector<T>,cocos2d::Map<K,V> 和 cocos2d::Value。

2.内存管理

cocos2d::Value 的内存是由它自己的析构函数自动处理的。所以当处理 cocos2d::Value 的内存时请坚持以 c++ 内存管理规则进行最佳实践。
cocos2d::Value 类包含了以下的数据成员:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15


union

{

   
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 的用法是非常简单的。
这里提供一个简单的示例:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38


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<Object*>* vecV =
new
Vector<Object*>();

vecV->pushBack(sp0);

Value val3(vecV);  
// 用 Vector 初始化

log
(
"The description of the Vector value:%s"
,val3.getDescription().c_str());

delete
vecV;

//----------------------------------------------------

Map<std::string, Object*>* mapV =
new
Map<std::string, Object*>();

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());

输出:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22


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<T> 和 cocos2d::Map<K,V>)而不是使用 cocos2d::CCBool,cocos2d::CCFloat,cocos2d::CCDouble,cocos2d::CCString,cocos2d::CCInteger 和旧 Objective-c 风格容器(cocos2d::CCArray 和 cocos2d::CCDictionary)。
    当你想要处理原生类型集合的时候,用 cocos2d::Value 封装原生类型,然后用新的模版容器 cocos2d::Vector<T> 和 cocos2d::Map<K,V> 组合它们。

Cocos2d-x3.0模版容器详解之三:cocos2d::Value

时间: 2024-11-19 00:16:10

Cocos2d-x3.0模版容器详解之三:cocos2d::Value的相关文章

Cocos2d-x3.0模版容器详解之——cocos2d::Vector&lt;T&gt;, cocos2d::Map&lt;K,V&gt;, cocos2d::Value

Cocos2d-x3.0模版容器详解之一:cocos2d::Vector<T>  http://www.cocoachina.com/bbs/read.php?tid=199793Cocos2d-x3.0模版容器详解之二:cocos2d::Map<K,V>  http://www.cocoachina.com/bbs/read.php?tid=199916Cocos2d-x3.0模版容器详解之三:cocos2d::Value  http://www.cocoachina.com/b

Cocos2d-x3.0模版容器具体解释之二:cocos2d::Map&amp;lt;K,V&amp;gt;

1.概述: 版本号: v3.0 beta 语言: C++ 定义在 "COCOS2DX_ROOT/cocos/base" 路径下的 "CCMap.h" 的头文件里. template <class K, class V> class CC_DLL Map; cocos2d::Map<K,V> 是一个内部使用了 std::unordered_map的关联容器模版. std::unordered_map 是一个存储了由key-value键值对组合成

[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ——通过知识共享树立个人品牌. 继上五篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不

Servlet 3.0 新特性详解

转自:https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性详解 张 建平2010 年 4 月 23 日发布 WeiboGoogle+用电子邮件发送本页面 6 Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署.其

模版引擎详解-兄弟连新版thinkphp 15、16

第15节:ThinkPHP 3.1.2 模板变量详解 1.模版基本使用 IndexAction里添加index方法,内容为: $this->assign('name','赵桐正');  // 将值“赵桐正”交给标识“name” $this->display(); //显示模版,Tpl文件夹下默认index.html Tpl下的模版index.html里显示模版变量name的值 {$name} 模版变量的值是由后台分配过来的. 2.模版变量输出: 支持标量输出:字符串.数字.bool等 支持常规

IIS7.0 Appcmd 命令详解和定时重启应用池及站点的设置

IIS7.0 Appcmd 命令详解 废话不说!虽然有配置界面管理器!但是做安装包的时候命令创建是必不可少的!最近使用NSIS制作安装包仔细研究了一下Appcmd的命令,可谓是功能齐全. 上网查了些资料,那些博客大部分都是转载的别人的.都是些基本的介绍,很多命令都没介绍到(不知道是不是我走眼了). 就连微软的 技术资源库 也不详细: 附地址:http://technet.microsoft.com/zh-cn/library/cc772200(WS.10).aspx(反正我找了一遍!没找到我要的

(转)OAuth 2.0授权协议详解和流程

这篇文章主要介绍了OAuth 2.0授权协议详解,本文对OAuth协议做了详解讲解,对OAuth协议的各个方面做了分解,读完本文你就会知道到底啥是OAuth了,需要的朋友可以参考下 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版.本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749. 一.应用场景 为了理解OAuth的适用场合,让我举一个假设的例子.有一个"云冲印"的网站,可

loadrunner11.0 安装破解详解使用教程

loadrunner11.0 安装破解详解使用教程 来源:互联网 作者:佚名 时间:01-21 10:25:34 [大 中 小] 很多朋友下载了loadrunner11但不是很会使用,这里简单介绍下安装教程,需要的朋友可以参考下 Loadrunner安装详解 一 .下载篇. 我的下载地址是:http://www.jb51.net/softs/71240.html 程序4G多,很大. 二.           安装篇 1.运行“setup.exe” 2. 点击安装,其中会有提示缺少“Microso

【甘道夫】Hive 0.13.1 on Hadoop2.2.0 + Oracle10g部署详解

环境: hadoop2.2.0 hive0.13.1 Ubuntu 14.04 LTS java version "1.7.0_60" Oracle10g ***欢迎转载,请注明来源***    http://blog.csdn.net/u010967382/article/details/38709751 到以下地址下载安装包 http://mirrors.cnnic.cn/apache/hive/stable/apache-hive-0.13.1-bin.tar.gz 安装包解压到