enum options {Yes,No};
class A{
int i;
string str;
options opt;
};
int main{
A obj;
obj.i=5;
obj.str="fine";
obj.opt="Yes"; // compiler error
}
如何指定const char *
选择?
答案 0 :(得分:13)
只做
obj.opt=Yes;
此代码:
obj.opt="Yes";
尝试将字符串文字(完全不同的类型)分配给枚举类型,C ++不会为您自动转换。
如何将const char *指定为opt?
你必须手动执行此操作,我喜欢保留一组免费函数,以便使用我的枚举进行这样的转换,即我将我的枚举包装在命名空间中并提供一些函数来处理它们:
namespace options
{
enum Enum {Yes,No,Invalid};
Enum FromString(const std::string& str);
// might also add ToString, ToInt, FromInt to help with conversions
}
Enum FromString(const std::string& str)
{
if (str == "Yes")
{
return Yes
}
else if (str == "No")
{
return No;
}
return Invalid; //optionally throw exception
}
现在你可以做到:
class A{
int i;
string str;
options::Enum opt; // notice change here
};
...
obj.opt=options::FromString("Yes");
所以你可以看到,C ++中的枚举可能不会给你其他语言中所有的枚举和口哨。你必须亲自手动转换。
答案 1 :(得分:3)
枚举不是字符串,只是值
obj.opt = Yes;
答案 2 :(得分:3)
因为枚举值不是字符串。这是正确的:
int main{
A obj;
obj.opt=Yes;
}
答案 3 :(得分:1)
你不能这样做。您将不得不使用一些字符串比较并进行设置。
答案 4 :(得分:1)
在您的情况下,您可以“转换”枚举到const char*
。你需要的只是创建宏。
例如:
#define ENUM_TO_CSTR(x) #x
然后:
obj.opt=ENUM_TO_CSTR(Yes)
。
此宏会将传递给它的所有内容转换为类似C的字符串。它不会转换变量值,只会转换它的名称!
int x = 10; cout << ENUM_TO_CSTR(x) << endl;
将在屏幕上打印x
(而非10
),因此请小心使用它!
答案 5 :(得分:1)
当您尝试分配“是”时,表示您尝试从枚举选项中分配字符串值而不是枚举常量。而是使用语法:
obj.opt = Yes;
尝试从obj:
打印opt的值 cout << obj.opt;
您将输出为0,因为枚举索引从0开始。是0且否是1。