14

我有如下课程:

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::RedCar::Red当使用时,当类有很多枚举,子类等 时,真的很难理解代码。
  2. 使用类型Color作为函数参数或返回值
  3. Color使用变量类型switch

我知道 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 的更高版本。

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

4

3 回答 3

22

在当前的 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 };
于 2012-04-10T15:56:07.033 回答
7

命名嵌套类中的枚举(如示例一):

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

    Color::Type getColor();
    void setColor(Color::Type);
};
于 2012-04-10T14:49:27.137 回答
5

当我想做这样的事情时,我倾向于在名称空间之外使用名称空间和 typedef(尽管通常我是在全局范围内而不是在类内部执行此操作)。像这样的东西:

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

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

Color myFav = colors::Red;
于 2012-04-10T14:51:43.677 回答