两个具有相同值的枚举,如何访问它们?

时间:2014-03-07 01:01:59

标签: c++ enums

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::JACK Card::Rank::QUEEN Card::Rank::KING的情况下访问TEN,JACK和Queen?

我使用ostream operator<<重载switch,但它有错误... 当我尝试创建一个在Deck类中初始化52张卡的构造函数时,我发现它是不可能的。

4 个答案:

答案 0 :(得分:1)

Card::Rank::TENCard::Rank::JACKCard::Rank::QUEENCard::Rank::KING之间确实没有区别。你无法区分它们。

和你写的一样

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

然后以编程方式尝试区分它们。但它们包含完全相同的值;它们难以区分。

答案 1 :(得分:0)

如果必须根据其中一个答案here键入Card::Rank::TEN,您应该可以使用Card::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时,您的代码将无法确定它是Ten,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时我们返回两个不同的值,因此编译器不允许它。

如果您在切换中使用enum Card::Rank::TEN值,则相同,因为与编译器不允许的值相同。

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

我很抱歉,除此之外我无法给出好的理由,标准本身可能不允许一致性。其他人可能会详细说明这一点。

答案 2 :(得分:0)

具有相同值的多个分支的交换机是错误的。枚举值只是编写整数的一种奇特方式,所以......

答案 3 :(得分:0)

您可以将枚举视为别名机制。所以我们通常用它来代替一个神奇的数字。

因此,我们不需要像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