W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
上一章我們談到了從真實世界的值(如撲克牌中的大小和花色)到程序世界內部表示(如整數或字符串)的映射。雖然我們實現了牌面大小和整型數、花色和整型數之間的映射,但必須指出,映射本身并沒有成為程序的一部分。
實際上,C++提供了一種稱為“枚舉類型”的特性使以下兩點成為可能,一是將映射作為程序的一部分,一是定義了組成映射的值的集合。比如,牌的花色(Suit)和大?。≧ank)可以以枚舉的形式定義:
enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES };
enum Rank { ACE=1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE,
TEN, JACK, QUEEN, KING };
默認情況下,枚舉類型中的第一個值映射為0,第二個映射為1,以此類推。如在Suit類型中,CLUBS(梅花)使用整型數0表示, DIAMONDS(方塊)使用1表示,等等。
Rank的定義中將ACE指定為1,覆蓋了默認的映射值。其他值以自然的方式遞推。
定義了這些類型之后,我們就可以在任何地方使用它們。比如,實例變量rank和suit可以分別用類型Rank和Suit來聲明:
struct Card
{
Rank rank;
Suit suit;
Card (Suit s, Rank r);
};
構造函數的參數類型也相應改變了?,F在,我們可以以枚舉類型的值為參數創(chuàng)建Card對象:
Card card (DIAMONDS, JACK);
一般約定,枚舉類型中值的名字全部用大寫字母表示。上面代碼要比下面使用整型數的方式清晰地多:
Card card (1, 11);
枚舉類型中的值是用整型數表示的,所以可用作向量的下標。因此原來的print函數不加修改即可工作。不過buildDeck還是要做些修改,如下:
int index = 0;
for (Suit suit = CLUBS; suit <= SPADES; suit = Suit(suit+1)) {
for (Rank rank = ACE; rank <= KING; rank = Rank(rank+1)) {
deck[index].suit = suit;
deck[index].rank = rank;
index++;
}
}
從某種程度上說,枚舉類型的使用會讓代碼的可讀性更好,不過同時也帶來了一點混亂。嚴格地講,不允許在枚舉類型上執(zhí)行數學運算,如suit++是不合法的。 而另一方面,在表達式suit+1中,C++自動將枚舉類型轉換為整型數,然后我們可以將結果強制轉換為枚舉類型:
suit = Suit(suit+1);
rank = Rank(rank+1);
當然,還有一種更好的處理方法,那就是為枚舉類型重載++操作符,但這已經超出本書的范圍了。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: