cocos2dx中供类使用的一些宏

来源:互联网 发布:java 二进制流 编辑:程序博客网 时间:2024/05/01 03:16

cocos2dx是一个开源的游戏引擎,开源的好处太多了。打开看看它的源码是兴奋的一件事情,看看大神们写代码的风格,学习下别人的代码结构。闲话不多说,今天和大家分享一下我对cocos2dx游戏引擎中供类使用的一些宏定义的见解。

既然是为类单独打造的,那就不免会涉及privateprotectedpublic三种类型的成员变量。先看2个只读类型的宏


这2个宏比较相似,都是定义了一个protected的成员变量和一个获取该成员变量的函数,第2个宏里面函数返回值类型是引用类型,这个和第1个宏稍微有点不一样。

varType :由宏传入的参数类型;

varName:有宏传入的参数名称;

funName:由宏传入的函数名称后半部分(当funName为“Type”时,实际是定义了一个名为getType的函数);

预处理运算符# #为宏扩展提供了一种连接实际变元的手段。如果替换文本中的参数用 # #相连,那么参数就被实际变元替换, # #与前后的空白符被删除,并对替换后的结果重新扫描。

当然,get##funName前面的public注定了这个函数公开的,那么如果没有特殊声明在此函数之后定义的成员变量和函数都是公开的了,所以在这些宏之后声明变量或者函数最好有重新声明privateprotectedpublic的习惯。


可能你已经注意到这个get##funName函数是个虚函数,我认为这是为了避免类的多次继承导致出现的函数名称相同的情况。

另外,这2个宏只是定义了获取变量的函数,但是并没有实现这个函数,所以在类的实现过程中还是要记得实现这个函数。

除了定义只读类型的成员变量和函数外,还有定义可读可写的成员变量和函数的宏定义


这2个宏和上面提到的2个宏十分相似,只是多了一个函数set##funName而已;

很多时候针对一个类的成员变量的获取函数的实现都只有简单的一行,程序员们都是一群很“懒”的一类,这样的函数他们都想懒得写,开个玩笑,哈哈哈哈


这2个宏和CC_PROPERTY_READONLYCC_PROPERTY_READYONLY_PASS_BY_REF的区别只是实现了get##funName函数而已;

get##funName函数可以在宏定义中实现,那么set##funName必须自己实现这也有点说不过去了,幸好cocos2dx里面的CC_SYNTHESIZECC_SYSTHESIZE_PASS_BY_REF宏实现了set##funName函数,不然我等有“强迫症”的人要苦恼了。。。


以上所描述的宏都比较适合简单的数据类型和不需要释放内存的数据,如果碰到数据量比较大的成员结构,我们频繁地调用set##funName函数给它赋值,又没有进行内存回收的话,内存泄露带来的后果是恐怖的,不过我们依然能够找到一个宏来解决这个问题。


在set##funName函数的实现过程中,先是将传入的参数的refrense+1,然后在释放成员变量占用的内存,再进行赋值,这样就很安全的避免了内存没有回收和其他地方释放成员变量占有的对象。通常,对于varType为指针时,采用CC_SYNTHESIZE_RETAIN宏较多。

程序在宏定义时只是简单的字符替换,在自己编写宏时要注意它的所有可能的应用场景,而不是为了简写代码而盲目的编写宏,对宏的理解不够带来的编译和程序问题可能就需要查找和调试很久。比如

#define MIN(x,y) x<y?x:y

z = MIN(2,5)+1;

z的值是多少?3还是2

把宏替换后,就相对于

z = 2<5?2:5+1;

当然z的值是2

最后,再列出几个简单的宏定义



0 0