【问题标题】:#define inside an enum or how to extend an enum#define 在枚举中或如何扩展枚举
【发布时间】:2023-04-10 10:40:02
【问题描述】:

我有几个类,每个类都使用相同的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,
};
};

这样可以吗? 我无法编译这段代码,你能帮我正确定义宏吗?

【问题讨论】:

    标签: c++ enums macros c-preprocessor


    【解决方案1】:

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

    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

    【讨论】:

    • 酷,但问题是枚举本身是无名的,所以你必须使用int 来表示任何颜色的变量。
    • 我刚刚发布了一个解决方案,可以让您解决这个问题。
    • 最终我需要编写一个函数来返回每个类的颜色。我可以使用未命名的枚举方法吗?
    • 这对 java 枚举有一个影响,并不是说它本身不好,但我认为在现实世界中使用它变得越来越复杂。跨度>
    【解决方案2】:

    http://ideone.com/Q2mIRk

    ColorCOLOR 不一样:

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

    另外,它是enumclass,都是小写的。

    另外,抛弃 cmets:

    #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 代表什么颜色……好吧,我就闭嘴。

    【讨论】:

    • 使用 MS-Word 编写 C 时会出现大写情况(哎呀!)。
    【解决方案3】:

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

    您的…Color 类的实例不代表颜色,因此类名有些误导。

    但无论如何……


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

    但您似乎只对提供 names 感兴趣,而不是任何强类型,在这种情况下您可以这样做……

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

    【讨论】:

    • 好的,其他人也回答了同样的问题,但没有说明为什么它在类型方面是个坏主意。我被 Avira 防病毒软件延迟,它将 [foo.exe](通过 Visual c++ 编译器运行上述代码)识别为恶意软件。至少可以这么说,糟糕的 AV。
    【解决方案4】:

    我倾向于从命名所有颜色的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
        };
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-10
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多