-------------------
在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