1. 程式人生 > >Cocos2dx 3.0 過渡篇(二十八)C++11強型別列舉

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,
}

首先。 這樣的型別的列舉會自己主動依據需求將型別轉換成整型;其次,由於沒有強制性的名字限定的要求,easy造成列舉型別名字的衝突。比如:
enum color1
{
	red,
	green,
	blue,
};

enum color2
{
	white,
	green,//這裡的green與上面的會有衝突
	yellow,
};

bool HelloWorld::init()
{
	int type_int = green;//編譯時這裡會報錯

	return true;
}

編譯報錯的原因是由於編譯器不知道你要的green究竟是color1的還是color2的。



2、強型別列舉。


定義強型別列舉需增加keywordenum 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