2008年8月14日 星期四

C++ - 列舉(Enumeration)

在寫程式的時候,常常自己設定一些變數用來記錄狀態,而這一些狀態通常只有機種,
在之前可能用字串表示,現在c++有另一個新的選擇了,那就是「列舉」

例如,我們用一個變數來記錄球的顏色,我們希望可以建立一個型態(就像int就是整數型態),
例如:
而這一個變數分別只能代表三種顏色,分別是「紅色」、「黑色」、「白色」
而我們就是用以下宣告:

enum Color {red, black,white};

若我們都沒有給它定義這三種顏色的數值是多少,則預設第一個是0,後面,同樣沒有給值的話,就是前面的數值加1。則此例為red=0,black=1,white=2。


enum Color {red=2,black=5,white}

這一個例子為red=2,black=5,white=6

而我們之後就可以建立一個新的變數它是屬於Color的這一個型態

Color mycolor = red;  // mycolor=0 這是錯誤的定義

這裡我們要注意一下,我們定義這一個變數時,可以給它這三種顏色作為它的初始值,但是,不能給它數值作為初始值

因此在寫判斷式時,就要寫像這樣

switch (mycolor)
{
  case red:
    printf("that is red\n");
    break;
  case black:
    printf("that is black\n");
    break;
  case white:
    printf("that is white\n");
    break;
  default:
    printf("out of define color\n");
}

而判斷式中的red,black,white也是可以用數字代替。
透過enumeration,我們可以比較好管理每一個變數型態的可能值。

另外,我們可以做以下運算:

Color mycolor = red;
std::cout << mycolor+1 << std::endl;

因red代表0,所以,mycolor+1的mycolor會被當作0,所以,最後印出來的結果會是1。


Color mycolor = Color(2);

上面這一個是另一個初始化的方法,使mycolor=2,因為,我們不能直接把mycolor設定為2,所以,可以用這一個方法取代

[2008.11.28 補充]
字串→數字(成立)
字串←數字(不成立)

[2009.01.07 補充]
可以建立匿名列舉

class foo {
  enum Color {red, black,white};
};

不論在其它類別或是本類別可以使用foo::red或foo::black或foo::white來使用


詳細解說可以參考C++ Gossip: 列舉(Enumeration)

沒有留言: