4

クラス内で列挙型を記述する正しい方法は何でしょうか? 私はコンウェイの人生ゲームのコードを C++ で書いています。だから私は、さまざまな種類のパターンに関する情報を含むパターンクラスを持っています:

class Patterns
{
public:
    Patterns();
    ~Patterns(void);

private:
    enum class PatternType
    {
        bloat,
        block,
        blinker,
        toad
    };

    PatternType pattern_;
};

私の目標は、ここで地球規模の空間を汚染することではありません。おっとの概念を念頭に置いて、クラス内で列挙型を記述する書き込み方法です。そうでない場合は、いくつかのより良い代替案と、この方法に対する利点を提案してください。クラス内に列挙型を記述する際に留意することについての入力は大歓迎です。

編集:@Jay Miller 彼の入力に基づいて、私は彼の3つの方法をすべて試しました

enum class PatternClassOut{ point, circle, triangle };

class Patterns
{
public:
  enum PatternSimple{bloat, block, blinker, toad};
  enum class PatternClassIn{cat, mouse, dog};
  //get set functions for all the enum variables

private:
  PatternClassOut  out_;
  PatternSimple    simple_;
  PatternClassIn   in_;
};

私の発見(コードを試して少しグーグルで調べた後):

  1. PatternSimple は、私の場合、クラス内で列挙型を記述する最も簡単な方法です。ただし、型の安全性が損なわれます。つまり、列挙値を他のデータ型と比較でき、エラーは発生しません。
  2. PatternClassIn はタイプ セーフを提供します。しかし、列挙値にアクセスするには、呼び出し関数にさらにコードを記述する必要があります。
  3. PatternClassOut は、両方の長所を提供します。型安全性を提供し、さらに呼び出し関数から列挙値にアクセスするコードは PatternSimple と同じです。
4

3 に答える 3

3

これをクラス外で利用できるようにしたい場合、列挙型を公開することは理にかなっています。として、enum classクラス名に加えて、値にアクセスするには列挙名が必要になります。

class Patterns {
public:
    enum class PatternType { ... };
...
};
void makePattern(Patterns::PatternType value) { ... };
makePattern(Patterns::PatternType::bloat);

これは列挙型クラスであるため、別のクラスの外に移動することは完全に有効な場合があります。グローバル名前空間への唯一の追加は、列挙型の名前です。

enum class Patterns {
   bloat,
   ...
};
void makePattern(Patterns value) { ... };
makePattern(Patterns::bloat);

列挙型でグループ化したい他の操作がある場合は、それをクラスにネストするのが理にかなっています。その場合、次のenum代わりに単に使用することを決定できenum classます。

class Patterns {
public:
    enum PatternType { ... };
    std::string toString() const { ... };
    ...
private:
    PatternType value;
};
...
...
void makePattern(Patterns::PatternType value) { ... };
makePattern(Patterns::bloat);
于 2014-11-20T16:17:21.177 に答える
0

あなたのアプローチは問題ありません。唯一の欠点は、クラスの外部から PatternType にアクセスしようとしている場合、プライベートと宣言されているため到達できないことです。

于 2014-11-20T16:07:31.537 に答える