我正在尝试通过遍历枚举来创建一副纸牌,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++
and rank++
,说明:
card.cpp|24|error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive]|
card.cpp|25|error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive]|
在不丢掉有用的枚举数据结构的情况下创建一副纸牌的最佳方法是什么?
我建议做一些不同的事情。创建一个Suit
和的向量到Rank
,并使用STL的功能在它们上循环
const std::vector<Suit> v_suit {Suit::clubs, Suit::diamonds, Suit::hearts, Suit::spades};
const std::vector<Rank> v_rank {Rank::one, Rank::two, Rank::three, Rank::four, Rank::five,
Rank::six, Rank::seven, Rank::eight, Rank::nine, Rank::ten, Rank::jack,
Rank::queen, Rank::king, Rank::ace};
是的,您必须输入两次,但这允许您使用它们想要的任何值(即不连续),而不使用笨拙的东西enum_count
(例如,您想要什么卡?给我钻石枚举enum_count !!),否需要转换,并使用提供给的迭代器std::vector
。
要使用它们:
for(const auto & s : v_suit)
for (const auto & r : v_rank)
cards.push_back({s,r});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句