将值分配给枚举类型

时间:2011-05-09 14:09:30

标签: c++ string enums enumeration

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 *选择?

6 个答案:

答案 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。