Cocos2d-x3.1中C++11強列舉型別
阿新 • • 發佈:2019-02-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、不限定作用域列舉。建立該種列舉時名字是可選的,有如下兩種方式:
- //有命名的
- enum color
- {
- red,
- };
- //無命名的
- enum
- {
- blue,
- }
首先,這種型別的列舉會自動根據需求將型別轉換成整型;其次,由於沒有強制性的名字限定的要求,容易造成列舉型別名字的衝突,例如:
- enum color1
- {
- red,
- green,
- blue,
- };
- enum color2
- {
- white,
- green,//這裡的green與上面的會有衝突
-
yellow,
- };
- bool HelloWorld::init()
- {
- int type_int = green;//編譯時這裡會報錯
- returntrue;
- }
編譯報錯的原因是因為編譯器不知道你要的green到底是color1的還是color2的。
2、強型別列舉。
定義強型別列舉需加入關鍵字enum class(或者等價地使用enum struct)。如下:
- enumclass 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);//設定縱向居中
- enumclass TextVAlignment
- {
- TOP,
- CENTER,//
- BOTTOM,
- };
- enumclass TextHAlignment
- {
- LEFT,
- CENTER,//看這裡
- RIGHT,
- };
從上面的程式碼就可以看出,強型別列舉中的成員都有各自的作用域,所以不用擔心命名會有衝突,就像上面的這個CENTER,使用起來就是:TextHAlignment::CENTER 與 TextVAlignment::CENTER。