2014-03-07 118 views
1
class Card 
{ 
public: 
    enum class Rank{ TWO = 2, THREE = 3, FOUR = 4, FIVE = 5, SIX = 6, SEVEN = 7, 
       EIGHT = 8, NINE = 9, TEN = 10, JACK = 10, 
       QUEEN = 10, KING = 10, ACE = 11 }; 
    Rank r; 

} 

是否可以在不使用Card::Rank::TEN Card::Rank::JACKCard::Rank::QUEEN Card::Rank::KING的情況下訪問TEN,JACK和Queen?兩個具有相同值的枚舉,如何訪問它們?

我超載ostream operator<<使用switch,但它有錯誤... 當我嘗試創建一個構造函數初始化52卡在類甲板上,我覺得它不可能。

+4

請出示不編譯的一部分,否則我們最終可能會幫助你解決一個錯誤的問題。 – dasblinkenlight

+1

注意:這是否是二十一點? Ace's也可以是1。 – Coderchu

回答

1

實在是Card::Rank::TENCard::Rank::JACKCard::Rank::QUEENCard::Rank::KING之間沒有什麼區別。你不能說他們分開。

這是一樣的,如果你寫

#define TEN 10 
#define JACK 10 
#define QUEEN 10 
#define KING 10 

然後以編程方式試圖來區分它們。但它們包含完全相同的值;他們是無法區分的。

0

在具有方面根據here,你應該能夠使用Card::TEN,而不是答案的一種類型Card::Rank::TEN,只要你申報你的enum這樣的:

class Card 
{ 
public: 
    enum Rank { TWO = 2, THREE = 3, FOUR = 4, FIVE = 5, SIX = 6, SEVEN = 7, 
       EIGHT = 8, NINE = 9, TEN = 10, JACK = 10, 
       QUEEN = 10, KING = 10, ACE = 11 }; 

不能使用兩個無論如何,switch聲明中的值相同。這是因爲當代碼運行並且您獲得值10時,您的代碼將無法確定它是否爲十,Jack,Queen或King。

請更改這些值或僅在交換機中使用其中的一個值。這是一個人爲的例子:

int function(int value) 
{ 
    int rv = 0; 

    switch (value) 
    { 
     case 0: 
      rv = 7; 
      break; 
     case 1: 
      rv = 8; 
      break; 
     case 1: 
      rv = 21; 
      break; 
     default: 
      rv = 0; 
      break; 
    } 

    return rv; 
} 

int main() 
{ 
    printf("What does function(1) return? %d", function(1)); 

    return 0; 
} 

這是沒有意義的,因爲我們返回兩個不同的值,當我們傳遞的價值1所以編譯器不允許這樣做。

這是相同的,如果你使用的Card::Rank::TENenum值開關,因爲他們相同的編譯器不允許它。

Card::Rank card = Card::Rank::TEN; 

switch(card) 
{ 
    // Some cases... 
    case Card::Rank::JACK: 
     // Do something 
     break; 
    case Card::Rank::TEN: // <- not allowed since it is the same as the case for Card::Rank::JACK. 
     // Do something else 
     break; 
    // Some more cases... 
} 

這是不允許的。下面看起來像應該是好的,因爲編譯器應該能夠看到它是兩個情況下運行相同的代碼,但它仍然不會工作。

switch(card) 
{ 
    // Some cases... 
    case Card::Rank::JACK: 
    case Card::Rank::TEN: // <- still not allowed, even though both code paths for case 10 do the same thing... 
     // Do something else 
     break; 
    // Some more cases... 
} 

,我很抱歉,但我不能給好推理除此之外,它可能不是標準本身的一致性允許的。其他人可能可以詳細說明這一點。

0

具有相同值的多個分支的開關是錯誤的。枚舉值只是寫一個整數一個奇特的方式,所以...

0

您可以查看enum作爲別名機制。所以我們通常用它來代替一個幻數。

因此,我們不需要寫像int card1 = 11;什麼是11?我們知道JACK,不知道11是什麼。

的另一個優點是,它限制了可能的值,並不會看到像int card2 = 14;

所以在這個角度來看,如果J,Q和K具有相同的價值,它會因爲他們沒有呈現很奇怪同一張牌。如果你想將一張卡片映射到一個值,那麼std :: map是一個不錯的選擇。

enum Rank{ TWO , THREE, FOUR, FIVE, SIX , SEVEN, ......}; 


static const std::map<Rank, value> = 
{ 
    {TWO, 2}, {THREE,3},...... 
}; 

如果作爲d_ominic提到的,ACE有兩個價值,也許你想嘗試std::multimap

相關問題