C++ 枚举值

标签 c++ enums

我正在尝试通过转换我之前创建的几个 Java 类来学习 C++。它们代表一张扑克牌和一副纸牌。我正在使用 enum 作为值和花色:

enum Suits{SPADES, CLUBS, HEARTS, DIAMONDS};

enum Values{TWO, THREE, FOUR, FIVE, 
            SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE};

在我的 JavaC++ Card 类中,我有方法:getValue()getSuit()显然分别返回值和花色。

我的 Java DeckofCards 类非常简单:

public class DeckofCards {

private Card card; 
private String value;
private String suit;
private List<Card> deck = new ArrayList<Card>();

//DeckofCards constructor
public DeckofCards(){
    for (Suits s : Suits.values()) {
        for(Values v : Values.values()){
            card = new Card(v,s);
            deck.add(card);
        }  
    }
}

//shuffles the deck
public void shuffleDeck(){
    Collections.shuffle(deck);
}

//prints the deck of cards
public void printDeck(){

    for(int i = 0; i<deck.size(); i++){
        card = deck.get(i);
        value = card.getValue().toString();
        suit = card.getSuits().toString();
        System.out.println(value + " of " + suit);
    }

}

//draws a card from the deck
public Card drawCard(){
    try{
        card = deck.get(0);
        deck.remove(0);
        //return card;
    }
    catch(IndexOutOfBoundsException e){
        System.err.println("Deck is empty");
        System.exit(0);
    }
    return card;
}

} 

我的问题是在 C++ 中实现 printDeck() 方法,特别是获取 enum 值的字符串表示形式。我知道我不能简单地做 getValue().toString() 所以我在对此事做了一些研究后的想法是制作两个 std::string[]看起来与两个 enum 相同,然后使用 getValue()getSuit() 生成一个 int(因为这似乎是行为)并将其传递到数组中以获取字符串表示形式。

但是我现在认为在我的 Card 类中再添加两个方法可能会更好:

std::string getValue(int i) 同样适合

并使用case 语句返回一个基于intstring 值,以便其他类可以轻松获取字符串表示形式。这似乎是多余的。谁能就如何执行此操作提供任何建议?

最佳答案

您可以使用新的 C++11 枚举类(即作用域枚举),并定义一个将此类枚举类作为输入参数的函数,并返回输入枚举值的相应字符串表示形式。

例如:

#include <assert.h>     // For assert()
#include <iostream>     // For console output
#include <string>       // For std::string

enum class Suits {
    SPADES, CLUBS, HEARTS, DIAMONDS
};

std::string toString(Suits s) {
    switch (s) {
    case Suits::SPADES:     return "Spades";
    case Suits::CLUBS:      return "Clubs";
    case Suits::HEARTS:     return "Hearts";
    case Suits::DIAMONDS:   return "Diamonds";
    default:
        assert(false);
        return "";
    }
}

int main() {
    std::cout << toString(Suits::CLUBS) << std::endl;
}

您可以对 Values 枚举做类似的事情。

关于C++ 枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22541567/

相关文章:

java - 枚举与类加载器

scala - 如何有效地从scala的枚举中选择一个随机元素?

c++ - 无法链接 Hello World!

c++ - 引用类型和存储期限

java - 如何使用 JNI 用 java 调用 C 方法(扫描仪 API)

JavaFX 将组合框中的字符串字段显示为字符串的枚举(在 TableView 中)

swift - 调整自定义类以与 CoreData 兼容

c++ - 在非模板化类析构函数中删除模板化类指针?

c++ - 使用索引几何 boost 多边形

java - 无法在被映射的枚举的初始值设定项内构造 EnumMap