Cocos2dx 3.0 过渡篇(二十八)C++11强类型枚举

一朋友在微信朋友圈晒了张照片,随手点开大图,带着欣赏的眼光扫了下,恩,几个月不见,又漂亮了...咦?等等,她戴的这是什么?酷炫的造型!金属边框!微型摄像头!这不是传说中的谷歌眼镜么?土豪啊,还好我们已经是朋友了...我先给了她一个赞,然后直奔主题,霸气回复道:我过几天去找你,你戴的是谷歌眼镜吧,哼哼小样,不想死的话...就让我...摸一下下可以么,我不奢求戴,摸一下就满足了...(哎,丢人啊)。

-------------------

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

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

1、不限定作用域枚举。创建该种枚举时名字是可选的,有如下两种方式:

//有命名的
enum color
{
	red,
};

//无命名的
enum
{
	blue,
}

首先,这种类型的枚举会自动根据需求将类型转换成整型;其次,由于没有强制性的名字限定的要求,容易造成枚举类型名字的冲突,例如:

enum color1
{
	red,
	green,
	blue,
};

enum color2
{
	white,
	green,//这里的green与上面的会有冲突
	yellow,
};

bool HelloWorld::init()
{
	int type_int = green;//编译时这里会报错

	return true;
}

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

2、强类型枚举。
定义强类型枚举需加入关键字enum class(或者等价地使用enum struct)
。如下:

enum class color
{
	red,
	green,
}

使用强类型枚举时必须指明其所属范围,如color::red,而不能直接使用red。(这里需说明一下,不限定类型枚举也可以指定其范围,如上面的color1::red,但它不是强制要求的,也就是可以直接使用red,这与强类型枚举有同父异母的区别,别混淆)。
下面举个cocos2dx中的例子来看下强类型枚举是怎么回事。

//首先创建一个label
auto label_2 = LabelTTF::create("star","Arial",25);//create a label
label_2->setHorizontalAlignment(TextHAlignment::CENTER);//设置横向居中
label_2->setVerticalAlignment(TextVAlignment::CENTER);//设置纵向居中

主要还是看TextHAlignment 与 TextVAlignment,它们就是强类型枚举。下面看下源码:

enum class TextVAlignment
{
    TOP,
    CENTER,//
    BOTTOM,
};

enum class TextHAlignment
{
    LEFT,
    CENTER,//看这里
    RIGHT,
};

从上面的代码就可以看出,强类型枚举中的成员都有各自的作用域,所以不用担心命名会有冲突,就像上面的这个CENTER,使用起来就是:TextHAlignment::CENTER 与 TextVAlignment::CENTER。

恩,暂时就扯到这里。强类型枚举还有一些其他功能大家可以自己去了解下。我就不多说了。

尊重原创,转载请注明来源:http://blog.csdn.net/star530/article/details/24273309

Cocos2dx 3.0 过渡篇(二十八)C++11强类型枚举,码迷,mamicode.com

时间: 2024-08-04 07:42:10

Cocos2dx 3.0 过渡篇(二十八)C++11强类型枚举的相关文章

Cocos2dx 3.0 过渡篇(二十九)globalZOrder()与localZOrder()

前天很难得的加班到八点...为什么说难得呢?因为平时我几乎就没加班过.六点下班后想走就走,想留就留.率直洒脱,不拘一格,尽显男儿本色.程序员,就是这么自信! -----------这篇博客的标题本想叫"...3.0新的渲染...介绍",最后还是拉不下这个脸.为啥?觉得自己对渲染的认识还是过于表面,谈不上理解.当然了,这并不影响这篇博客继续写下去.下面看一段3.0Release Notes 对于新渲染器的一段介绍: Node 增加了新的函数 setGlobalZOrder() / get

Cocos2dx 3.0 过渡篇(三十一)ValueVector和Vector不得不说的故事

本文投票地址:http://vote.blog.csdn.net/Article/Details?articleid=37834689 前天看到一个颇为纠结的选择题:有一天你遇到一个外星人,这时外星人很热情的邀请你到他们星球去玩,你如何选 1:去,但是你有可能永远不能在回来.2:不去,但是外星人会消去你的记忆 这问题很刺激有木有?!看似简单的一个问题,不同的答案却隐藏着不同的含义.------------------鱼与熊掌不可兼得,类似这种例子生活中会经常碰到.同样的,如果你有去了解过Coco

Cocos2dx 3.0 过渡篇(二十五)死不了的贪食蛇(触摸版)

上一篇写的贪食蛇的重力感应控制版,这一篇就讲下触摸控制版吧.额,也不知道写了那个贪食蛇教程究竟有没有获得沈老师的书,假设没有的话,看我不拿西瓜刀砍掉 偶尔E往事 的那啥! 重力版链接:http://blog.csdn.net/start530/article/details/23707985 触摸版与重力版的代码大部分都一样,不一样的地方就是要将打开重力感应换成创建一个触摸监听.步骤例如以下: 1.在GameLayer的init()中创建一个触摸监听事件 [cpp] view plaincopy

Cocos2dx 3.0 过渡篇(三十二)话说ValueMap的一般使用

周末到厦门找死党聚聚,晚上一伙人杀到一还算凑合的大排档准备来个不醉不归.菜都点完了朋友突然说这里没有洗手间...尼玛,当时我们就不乐意了:喝五六个小时的啤酒,没有洗手间你是打算憋死谁?二话不说直接换一家,不过这次一定要谨慎选择,最终看到一家看起来还算正宗的大排档,我下意识拨了下头发,走到前台MM面前,轻声问道:你们这...有洗手间吗? 声音低沉且性感,语调中还夹带着些许的忧伤. 前台MM瞪大眼睛,好一会才反应过来说道:洗手间?肯定有啊! ----------------------------

Cocos2dx 3.0 过渡篇(二十七)C++11多线程std::thread的简单使用(下)

本篇接上篇继续讲:上篇传送门:http://blog.csdn.net/star530/article/details/24186783 简单的东西我都说的几乎相同了,想挖点深的差点把自己给填进去. 以下实际演练一下.请同意我參考偶尔E往事的一篇线程的博客, 他用的是pThread.这里我就用std::thread. 1.售票孙鑫老师的C++和Java多线程售票也一直让我念念不忘(好吧,我承认我没看过).这里用cocos2d-x3.0和C++11的std::thread实现一个吧.总共同拥有10

Cocos2d-x 3.x 图形学渲染系列二十八

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 昨天,刚从丈母娘家回来,继续博客的更新,接着Cocos2d-x 3.x图形学渲染系列二十七继续系列二十八的编写. 接下来读取FBX模型文件信息,首先要做的是把读取的模型信息进行归类并

Android项目实战(二十八):Zxing二维码实现及优化

原文:Android项目实战(二十八):Zxing二维码实现及优化 前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中我们也许只会用到二维码的扫描和生成两个功能,所以不必下载完整的jar包,使用简化版的即可,下文可见. 这篇文章讲述:1.如果快速在项目中集成zxing,实现扫描和生成二维码功能 2.根据项目需求去修改源码实现我们的要求并进行优化 一.快速集成zxing二维码 1.下载库文件 : http://do

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t

每日算法之二十八:Longest Valid Parentheses

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring. For "(()", the longest valid parentheses substring is "()", which has length = 2. Another example is &