我试图制作一个小型扑克计划。我这里有一个小问题。我的枚举如何保存字符串而不是字符?
x=1
sum1=0
n=int(input("enter how long the series should be"))
print (x)
for a in range (1,n):
sum1=sum1+(x**a)
print(sum1)
a=a+1
print("the sum of the series is",sum1)
此时它给了我一个编译器错误:" main.cpp | 7 | error:' Hearts'的枚举值。不是整数常量|"。
答案 0 :(得分:2)
你不能。你可以做的是初始化一个字符串数组,并使用枚举类型来索引它。 请注意,我也改变了枚举类型的标记(我相信你的意思,所以它需要在枚举之后定义,或者你应该使用typedef。
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
enum mark{Hearts=0,Diamonds, Spades, Clubs} marks[5];
string mark_names[4] = {"Hearts","Diamonds", "Spades", "Clubs"};
char cards[5];
int main()
{
srand(time(NULL));
cout<<"Welcome to the Classic Poker!\n";
cards[0]='4';
marks[0]=Hearts;
cout<<"cards[0]="<<cards[0]<<endl;
cout<<"marks[0]="<<mark_names[marks[0]]<<endl;
}
现在如果你不想输入两次名字,并且你愿意做一些宏观技巧,这里有一个很好的选择 - 在外部文件中定义名称,并将它们包括在内这样:
enum mark{
#define DEF_MARK(a) a,
#include "marks.def"
} marks[5];
string mark_names[4] = {
#define DEF_MARK(a) #a,
#include "marks.def"
};
其中marks.def是:
DEF_MARK(Hearts)
DEF_MARK(Diamonds)
DEF_MARK(Spades)
DEF_MARK(Clubs)
#undef DEF_MARK
我建议最后一项改进是添加最后一个DEF_MARK(MAX_MARK),然后在程序中使用MAX_MARK作为数组大小(而不是令人讨厌的硬编码4)
答案 1 :(得分:2)
根本不可能,枚举器是不可或缺的。
然而,您可以轻松完成的是构建一个将每个枚举器与字符串相关联的简单函数:
enum mark { Hearts, Diamonds, Spades, Clubs };
std::string to_string(mark const m) {
switch (m) {
case Hearts: return "Hearts";
case Diamonds: return "Diamonds";
case Spades: return "Spades";
case Clubs: return "Clubs";
}
throw std::runtime_error("Unknown value");
}