我正在尝试通过迭代枚举 Suit
和 Rank
来创建一副牌(我知道没有很好的方法来迭代枚举,但我没有看到替代方案) .我通过在每个枚举的末尾添加一个枚举 enum_count
来做到这一点,其值表示枚举的长度和结尾。
#include <vector>
using namespace std;
enum class Suit: int {clubs, diamonds, hearts, spades, enum_count};
enum class Rank: int {one, two, three, four, five, six, seven, eight,
nine, ten, jack, queen, king, ace, enum_count};
struct Card {
Suit suit;
Rank rank;
};
class Deck{
vector<Card> cards{};
public:
Deck();
};
Deck::Deck() {
// ERROR ON THE BELOW LINE
for (Suit suit = Suit::clubs; suit < Suit::enum_count; suit++) {
for (Rank rank = Rank::one; rank < Rank::enum_count; rank++) {
Card created_card;
created_card.suit = suit;
created_card.rank = rank;
cards.push_back(created_card);
};
};
};
但是,当我尝试遍历枚举时,编译器不喜欢我尝试在 for 循环中增加 suit++
和 rank++
,说明:
card.cpp|24|error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive]|
card.cpp|25|error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive]|
在不丢弃有用的枚举数据结构的情况下创建一副纸牌的最佳方法是什么?
原文由 DBedrenko 发布,翻译遵循 CC BY-SA 4.0 许可协议
我会建议做一些不同的事情。创建一个
Suit
和一个到Rank
的向量,并使用 STL 的强大功能循环它们是的,你必须输入两次,但这允许你使用你想要的任何值(即不连续),而不是使用像
enum_count
(你想要什么卡?给我一个diamonds enum_count!!),不需要强制转换,并使用提供给std::vector
的迭代器。要使用它们: