Cocos2d-x3.1中C++11强枚举类型

转载自:http://blog.csdn.net/star530/article/details/24273309

在cocos2dx 3.0的文档里有这么一句话:

以 k 开头的常量和枚举量,通常被定义为 int 或者简单的 enum 类型,现在已经被强类型枚举(enum class)所替代,这样有利于避免ChongTu和类型错误。
新的格式是:
| v2.1       | v3.0        |
| kTypeValue | Type::VALUE |


写到这里,我头发一甩,笔锋一转...试问:什么是强类型枚举?回答这个问题还是要从枚举的分类说起。
C++11后,枚举有两种类型,一种是不限定作用域的枚举,另一种是限定作用枚举,也就是上面说的强类型枚举

1、不限定作用域枚举
。创建该种枚举时名字是可选的,有如下两种方式:
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //有命名的  
  2. enum color    
  3. {  
  4.     red,  
  5. };  
  6.   
  7. //无命名的  
  8. enum   
  9. {  
  10.     blue,  
  11. }  

首先, 这种类型的枚举会自动根据需求将类型转换成整型;其次,由于没有强制性的名字限定的要求,容易造成枚举类型名字的冲突 ,例如:
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. enum color1  
  2. {  
  3.     red,  
  4.     green,  
  5.     blue,  
  6. };  
  7.   
  8. enum color2  
  9. {  
  10.     white,  
  11.     green,//这里的green与上面的会有冲突  
  12.     yellow,  
  13. };  
  14.   
  15. bool HelloWorld::init()  
  16. {  
  17.     int type_int = green;//编译时这里会报错  
  18.   
  19.     return true;  
  20. }  

编译报错的原因是因为编译器不知道你要的green到底是color1的还是color2的。

2、强类型枚举。
定义强类型枚举需加入关键字enum class(或者等价地使用enum struct)
。如下:
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. enum class color  
  2. {  
  3.     red,  
  4.     green,  
  5. }  

使用强类型枚举时必须指明其所属范围,如color::red,而不能直接使用red。(这里需说明一下, 不限定类型枚举也可以指定其范围,如上面的color1::red,但它不是强制要求的,也就是可以直接使用red,这与强类型枚举有同父异母的区别,别混淆 )。
下面举个cocos2dx中的例子来看下强类型枚举是怎么回事。
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //首先创建一个label  
  2. auto label_2 = LabelTTF::create("star","Arial",25);//create a label  
  3. label_2->setHorizontalAlignment(TextHAlignment::CENTER);//设置横向居中  
  4. label_2->setVerticalAlignment(TextVAlignment::CENTER);//设置纵向居中  
主要还是看TextHAlignment 与 TextVAlignment,它们就是强类型枚举。下面看下源码:
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. enum class TextVAlignment  
  2. {  
  3.     TOP,  
  4.     CENTER,//  
  5.     BOTTOM,  
  6. };  
  7.   
  8. enum class TextHAlignment  
  9. {  
  10.     LEFT,  
  11.     CENTER,//看这里  
  12.     RIGHT,  
  13. };  

从上面的代码就可以看出,强类型枚举中的成员都有各自的作用域,所以不用担心命名会有冲突,就像上面的这个CENTER,使用起来就是:TextHAlignment::CENTER 与 TextVAlignment::CENTER。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值