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

defineC++にはenumの継承がないので、共通部分に使いたい

#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

現在、この種のことを管理できる 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::Holderclass DressColor

于 2013-01-11T11:58:47.277 に答える
0

http://ideone.com/Q2mIRk

Colorここと同じではありませんCOLOR:

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

また、enumすべて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クラスのインスタンスは色を表現しないので、クラス名はやや誤解を招きます。

とにかく…


an の拡張enumは、サブクラス化ではなくスーパークラス化を必要とするという点で簡単ではありません。そのため、言語でサポートされていません。

しかし、強力な型付けではなく、名前を利用できるようにすることのみに関心があるようです。その場合、できることは…

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 に答える