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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章