【问题标题】:Assigning values to enumerated types为枚举类型赋值
【发布时间】:2011-05-09 14:09:30
【问题描述】:
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 * 来选择?

【问题讨论】:

    标签: c++ string enums enumeration


    【解决方案1】:

    做吧

       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++ 中的枚举可能不会为您提供其他语言中枚举的所有花里胡哨。您必须自己手动转换。

    【讨论】:

    • 我也提供了从/到字符串转换函数(实际上我已经将枚举创建包装在一个宏中,以便始终提供它们),只是在调试中更容易阅读日志并作为参数传递(被解析)。
    【解决方案2】:

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

    obj.opt = Yes;
    

    【讨论】:

      【解决方案3】:

      因为枚举值不是字符串。这是正确的:

      int main{
          A obj;
      
          obj.opt=Yes;
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          在您的情况下,您可以“convert” 枚举到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),因此请小心使用!

          【讨论】:

            【解决方案6】:

            当您尝试分配“是”时,这意味着您正在尝试分配一个字符串值,而不是枚举选项中的枚举常量。而是使用以下语法:

                obj.opt = Yes;
            

            尝试从 obj 打印 opt 的值:

                cout << obj.opt;
            

            您将得到输出为 0,因为枚举索引从 0 开始。Yes 为 0,No 为 1。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-08-31
              • 1970-01-01
              • 2013-04-05
              • 2018-10-18
              • 1970-01-01
              • 2019-03-31
              • 2018-02-14
              • 1970-01-01
              相关资源
              最近更新 更多