0

我有几个类,每个类都使用相同enum但根据其要求对其进行了一些扩展。例如 :

class skirtColor{
  enum Color{
red = 1,
blue = 10,
green = 12
};
};
class dressColor {
enum Color{
red = 1,
pink,
yellow,
blue = 10,
green = 12
};
};
class pantsColor {
enum Color {
red = 1,
brown,
blue = 10,
green = 12
};
};

由于 C++ 中没有枚举的继承,所以我想将其define用于公共部分

#define COLOR\
// red color \
red = 1,\
// blue color \
blue = 10,\
//green color
green = 12,

之后我可以在类中重用常见的颜色定义

class skirtColor{
  enum Color{
COLOR
};
};
class dressColor {
enum Color{
COLOR
pink = 2,
yellow,
};
};
Class pantsColor {
enum Color {
COLOR
brown = 2,
};
};

这种方式可以吗?我无法编译这段代码你能帮我正确的宏定义吗?

4

4 回答 4

5

目前你可以管理这种事情的一种方法是继承,它将从类中继承常量。

struct Color
{
     enum { red = 1, blue = 10, green = 12 };
} ;

struct DressColor : Color
{
     enum { pink =2, yellow = 3 };
};

并且 DressColor 也会有红色、蓝色和绿色..

如果要启用“严格类型”以具有必须具有这些值之一的变量,则可以使用具有“具有”值且只能从类中构造或修改的类来执行此操作。

struct Color
{
    class Holder
    {
        private:
        int value;
        explicit Holder( int v ) : value( v ) {}

        public:
        bool operator==( const Holder & other ) const
        {
            return value == other.value;
        }

        int get() const
        {
            return value;
        }

        friend struct Color;
    };

  protected:        
    static Holder makeHolder( int v )
    {
        return Holder( v );
    }

  public:
    static const Holder red;
    static const Holder blue;
    static const Holder green;
};


struct DressColor : Color
{
    static const Holder pink;
    static const Holder yellow;
};

     // these in a .cpp file.
const Color::Holder Color::red( 1 );
const Color::Holder Color::blue( 10 );
const Color::Holder Color::green( 12 );
const Color::Holder DressColor::pink( Color::makeHolder(2) );
const Color::Holder DressColor::yellow( Color::makeHolder(3) );

     // how you can create a variable of one. Note that whilst you cannot construct
     // a Color::Holder from an int in the regular way, you can copy-construct.

     Color::Holder var( Color::red );

当然,在这个“解决方法”中,枚举对象仍然是类型Color::Holder,不能是DressColor::Holder使用的类型class DressColor

于 2013-01-11T11:58:47.277 回答
0

http://ideone.com/Q2mIRk

Color和这里不一样COLOR

Enum Color{
Color
Pink = 2,
yellow,
};

此外,它是enumand class,都是小写的。

另外,放弃评论:

#define COLOR\
// red color \
red = 1,\
// blue color \
blue = 10,\
//green color
green = 12,

因为尾随\将使所有内容成为评论。以上将扩展为:

// red color red = 1, // blue color blue = 10, //green color green = 12,

说啊

#define COLOR \ 
red = 1,\
blue = 10,\
green = 12,

如果有人不知道颜色red代表什么……好吧,我就闭嘴。

于 2013-01-11T11:55:16.250 回答
0

您的代码甚至没有使 C++ 关键字正确。

而且你的……类的实例Color不代表颜色,所以类名有点误导。

但不管怎么说…


扩展 anenum并非易事,因为它需要超类化,而不是子类化,这就是语言不支持它的原因。

但似乎你只对可用的名称感兴趣,而不是任何强类型,在这种情况下你可以做......

struct SkirtColors
{
    enum { red = 1, blue = 10, green = 12 };
};

struct DressColors
    : SkirtColors
{
    enum { pink = 2, yellow = 3 };
};
于 2013-01-11T12:18:30.087 回答
0

我倾向于从enum命名所有颜色开始,然后为各种特定颜色添加枚举并使用第一个值:

struct colors {
    enum colors {
        red = 1,
        blue = 10,
        pink = 2,
        green = 12,
        yellow = 3
    }; 
};

struct skirt_colors {
    enum colors {
        red = colors::red,
        blue = colors::blue,
        green = colors::green
    };
};
于 2013-01-11T12:38:34.403 回答