Accessing to enum values by '::' in C++

我是研究僧i 提交于 2020-06-24 11:36:06

问题


I have class like following:

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;
}

I want to:

  1. access to Color values as Color::Red. It is really hardly to understand code when Car::Red is used, when class have a lot enums, subclasses etc.
  2. use type Color as function argument or return value
  3. use variable type Color in switch

I know 3 partial solutions:

  1. Using embedded class Color and enum in it
  2. Using embedded namespace Color and enum in it
  3. Using enum class

1 and 2 solutions solves a Color::Red accession problem, but I can't use functions like Color getColor() and void setColor(Color).

3 solution has a problem: VS2010 doen't support enum class. GCC v.4.1.2 doesn't support it too. I don't know about later versions of gcc.

Yes, I'm working on cross-platform project.
I have found this solution, but it seems ... heavy.
I hope somebody can help me here :)


回答1:


In current C++ (i.e. C++11 and beyond), you can already access enum values like that:

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

You can go further and enforce the use of this notation:

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

And on a sidenote, you now define the underlying type, which was previously only possible with hacky code (FORCEDWORD or so anyone?):

enum class Color : char { Red };



回答2:


Name the enum inside the nested class (as example one):

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

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



回答3:


When I want to do something like this I tend to use a namespace and a typedef outside of th namespace (though usually I'm doing this globally rather than inside a class). Something like this:

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

This way you use the namespace to get at the actual colors, but the Color type itself is still globally accessible:

Color myFav = colors::Red;


来源:https://stackoverflow.com/questions/10090949/accessing-to-enum-values-by-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!