作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试通过遍历枚举 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]|
在不丢弃有用的枚举数据结构的情况下创建一副纸牌的最佳方法是什么?
最佳答案
我建议做一些不同的事情。创建一个 Suit
vector 和一个到 Rank
的 vector ,并使用 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});
关于c++ - 如何使用枚举类值作为 for 循环的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35313043/
我是一名优秀的程序员,十分优秀!