为枚举类型赋值

7
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 * 赋值给 opt?
6个回答

14

只需这样做

   obj.opt=Yes;

这段代码:

   obj.opt="Yes";
尝试将字符串字面值(完全不同的类型)分配给枚举类型,C++不会自动转换。
你需要手动进行转换,我喜欢在命名空间中封装我的枚举,并提供一些用于处理它们的函数。
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++中,枚举类型可能不像其他语言中的枚举类型那样功能齐全。您需要手动进行转换。

我也提供了字符串转换函数(实际上,我已经用宏包装了枚举创建,以便在任何时候都能提供它们),这样在调试日志中阅读和传递参数(进行解析)会更容易。 - Matthieu M.

4

因为枚举值不是字符串。以下写法是正确的:

int main{
    A obj;

    obj.opt=Yes;
}

3

枚举不是字符串,而只是值

obj.opt = Yes;

1

你不能这样做。你必须使用一些字符串比较并设置它。


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),因此在使用时要小心!

1
当您尝试分配“是”时,这意味着您正在尝试分配字符串值而不是枚举选项中的枚举常量。请改用以下语法:
    obj.opt = Yes;

尝试从 obj 中打印 opt 的值:

    cout << obj.opt;

由于枚举索引从0开始,因此您将获得输出为0。是为0,否为1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接