为枚举类型赋值

发布于 2024-11-06 06:58:23 字数 243 浏览 1 评论 0原文

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?

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
}

How can assign const char * to opt?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

嘦怹 2024-11-13 06:58:23

只需执行

   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
}

现在您可以do:

 class A{
   int i;
   string str;
   options::Enum opt; // notice change here
 };

 ...


obj.opt=options::FromString("Yes");

所以你可以看到,C++ 中的枚举可能不会为你提供其他语言中枚举的所有花哨功能。您必须自己手动转换内容。

Just do

   obj.opt=Yes;

This code:

   obj.opt="Yes";

attempts to assign a string literal (a completely different type) to an enum type, which C++ doesn't automagically convert for you.

How can assign const char * to opt?

You'll have to do this manually, I like to keep a set of free functions around for doing conversions like this with my enums, ie I'll wrap my enums in a namespace and provide some functions for working with them:

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
}

Now you can do:

 class A{
   int i;
   string str;
   options::Enum opt; // notice change here
 };

 ...


obj.opt=options::FromString("Yes");

So you can see, enums in C++ probably don't give you all the bells and whistles of enums in other languages. You'll have to manually convert things yourself.

心碎无痕… 2024-11-13 06:58:23

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

int main{
    A obj;

    obj.opt=Yes;
}

Because an enum value is not a string. This is correct :

int main{
    A obj;

    obj.opt=Yes;
}
琴流音 2024-11-13 06:58:23

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

obj.opt = Yes;

Enums are not strings, but just values

obj.opt = Yes;
や莫失莫忘 2024-11-13 06:58:23

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

You can't do this. You will have to use some string comparisons and set it.

陈独秀 2024-11-13 06:58:23

在您的情况下,您可以“转换”枚举为const char*。您所需要的只是创建宏。
例如:
#define ENUM_TO_CSTR(x) #x
进而:
obj.opt=ENUM_TO_CSTR(是)

该宏会将您传递给它的所有内容转换为类似 C 的字符串。它不会转换变量值,而只会转换其名称!

int x = 10;计算<< ENUM_TO_CSTR(x) << endl;

将在屏幕上打印 x (不是 10),所以要小心使用它!

In your case you can "convert" enum to const char*. All what you need is to create macro.
For example:
#define ENUM_TO_CSTR(x) #x
and then:
obj.opt=ENUM_TO_CSTR(Yes).

This macro will convert everything you pass to it into C-like string. It won't convert variable value, but only its name!

int x = 10; cout << ENUM_TO_CSTR(x) << endl;

Will print x (not 10) on screen, so be careful using it!

葮薆情 2024-11-13 06:58:23

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

    obj.opt = Yes;

尝试从 obj 打印 opt 的值:

    cout << obj.opt;

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

When you try to assign "Yes" it means that you are trying to assign a string value and not the enum constant from the enum options. Instead use the syntax:

    obj.opt = Yes;

Try printing the value of opt from obj:

    cout << obj.opt;

You will get the output as 0, since enum indices start from 0. Yes is 0 and No is 1.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文