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

时间:2012-04-10 14:46:46

标签: 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;
}

我想:

  1. Color值视为Color::Red。当使用Car::Red时,当类有很多枚举,子类等时,很难理解代码。
  2. 使用类型Color作为函数参数或返回值
  3. Color
  4. 中使用变量类型switch

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

    1. 使用嵌入式课程Color并在其中加入
    2. 使用嵌入式命名空间Color并在其中枚举
    3. 使用enum class
    4. 1和2解决方案解决了Color::Red加入问题,但我无法使用Color getColor()void setColor(Color)等函数。

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

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

3 个答案:

答案 0 :(得分:17)

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

enum Color { Red };
Color c = Color::Red;
Color d = Red;

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

enum class Color { Red };
Color c = Color::Red;
// Color d = Red;   <--  error now

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

enum class Color : char { Red };

答案 1 :(得分:7)

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

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

    Color::Type getColor();
    void setColor(Color::Type);
};

答案 2 :(得分:5)

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

namespace colors 
{
    enum Color 
    {
        Red,
        Blue
        ...
    }
}
typedef colors::Color Color;

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

Color myFav = colors::Red;