在C++中通过'::'访问枚举值

Jur*_*ury 11 c++ enums

我有以下课程:

class Car  
{  
public:  
    Car();  
    // Some functions and members and <b>enums</b>  
    enum Color
    {
        Red,
        Blue,
        Black
    };  
    Color getColor();
    void setColor(Color);  
private:  
    Color myColor;
}
Run Code Online (Sandbox Code Playgroud)

我想要:

  1. 访问Color值为Color::Red.Car::Red使用时,当类有很多枚举,子类等时,很难理解代码.
  2. 使用type Color作为函数参数或返回值
  3. 使用可变型Colorswitch

我知道3个部分解决方案:

  1. 使用嵌入式类Color和枚举
  2. 在其中使用嵌入式命名空间Color和枚举
  3. 运用 enum class

1和2解决方案解决了Color::Red加入问题,但我不能使用像Color getColor()和的功能void setColor(Color).

3解决方案有一个问题:VS2010不支持enum class.GCC v.4.1.2也不支持它.我不知道更高版本的gcc.

是的,我正在从事跨平台项目.
我找到了这个解决方案,但似乎......很重.
我希望有人可以帮助我:)

Seb*_*ach 17

在当前的C++(即C++ 11及更高版本)中,您已经可以访问这样的枚举值:

enum Color { Red };
Color c = Color::Red;
Color d = Red;
Run Code Online (Sandbox Code Playgroud)

您可以进一步强制使用此表示法:

enum class Color { Red };
Color c = Color::Red;
// Color d = Red;   <--  error now
Run Code Online (Sandbox Code Playgroud)

在旁注中,您现在定义基础类型,以前只能使用hacky代码(FORCEDWORD或者任何人?):

enum class Color : char { Red };
Run Code Online (Sandbox Code Playgroud)


Mar*_*k B 7

在嵌套类中命名枚举(例如一个):

class Car
{
public:
    struct Color
    {
        enum Type
        {
            Red,
            Blue,
            Black
        };
    };

    Color::Type getColor();
    void setColor(Color::Type);
};
Run Code Online (Sandbox Code Playgroud)

  • 您还可以提及“C++11”功能“枚举类”。 (2认同)

obm*_*arg 5

当我想做这样的事情时,我倾向于使用命名空间和命名空间之外的typedef(虽然我通常是全局而不是在类中).像这样的东西:

namespace colors 
{
    enum Color 
    {
        Red,
        Blue
        ...
    }
}
typedef colors::Color Color;
Run Code Online (Sandbox Code Playgroud)

这样您可以使用命名空间来获取实际颜色,但Color类型本身仍可全局访问:

Color myFav = colors::Red;
Run Code Online (Sandbox Code Playgroud)