1. 程式人生 > >Cocos2d-x3.1中C++11強列舉型別

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、不限定作用域列舉
。建立該種列舉時名字是可選的,有如下兩種方式:
  1. //有命名的
  2. enum color    
  3. {  
  4.     red,  
  5. };  
  6. //無命名的
  7. enum
  8. {  
  9.     blue,  
  10. }  

首先,這種型別的列舉會自動根據需求將型別轉換成整型;其次,由於沒有強制性的名字限定的要求,容易造成列舉型別名字的衝突,例如:
  1. enum color1  
  2. {  
  3.     red,  
  4.     green,  
  5.     blue,  
  6. };  
  7. enum color2  
  8. {  
  9.     white,  
  10.     green,//這裡的green與上面的會有衝突
  11.     yellow,  
  12. };  
  13. bool HelloWorld::init()  
  14. {  
  15.     int type_int = green;//編譯時這裡會報錯
  16.     returntrue;  
  17. }  

編譯報錯的原因是因為編譯器不知道你要的green到底是color1的還是color2的。

2、強型別列舉。
定義強型別列舉需加入關鍵字enum class(或者等價地使用enum struct)
。如下:
  1. enumclass color  
  2. {  
  3.     red,  
  4.     green,  
  5. }  

使用強型別列舉時必須指明其所屬範圍,如color::red,而不能直接使用red。(這裡需說明一下,不限定型別列舉也可以指定其範圍,如上面的color1::red,但它不是強制要求的,也就是可以直接使用red,這與強型別列舉有同父異母的區別,別混淆
)。
下面舉個cocos2dx中的例子來看下強型別列舉是怎麼回事。
  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,它們就是強型別列舉。下面看下原始碼:
  1. enumclass TextVAlignment  
  2. {  
  3.     TOP,  
  4.     CENTER,//
  5.     BOTTOM,  
  6. };  
  7. enumclass TextHAlignment  
  8. {  
  9.     LEFT,  
  10.     CENTER,//看這裡
  11.     RIGHT,  
  12. };  

從上面的程式碼就可以看出,強型別列舉中的成員都有各自的作用域,所以不用擔心命名會有衝突,就像上面的這個CENTER,使用起來就是:TextHAlignment::CENTER 與 TextVAlignment::CENTER。