1

インスタンスの状態を返すメソッドを持つ基本クラスがあるとします。

enum STATE {ALIVE, DEAD}

class BASE{
    virtual STATE doThingsAndReturnStatus() {...};
}

これで、追加の状態を持つ可能性のある派生クラスができHALFDEADました。派生クラスごとに STATE をグローバルに追加する必要がない限り、インターフェイスを一貫させるのは難しいようです。STATE(つまり、 inの定義に新しい項目を追加しますclass BASE)。私の質問は、ベース クラスまたはファイルにそれが含まれていることに触れずに、派生クラスのこのタイプの拡張を実現する方法です。)

「enum」だけに議論を限定する必要はありません。

ここに関連するスレッドを見つけました。しかし、それは私のニーズには合いません:

C++ で列挙型を拡張しますか?

4

2 に答える 2

3

enumintまたはstringまたはまたは そのようなものに置き換えることができますfloat

ただし、それもおそらく素晴らしいアイデアではありません。enum[in an imaginary version of C++ that has this capability] を拡張できると仮定するとgetMyStatus、 は仮想関数であるため、派生クラスの詳細を知らない汎用コードから呼び出されるように設計されています。したがって、次のように書くと:

for(iter : baseClassContainter)
{
    status = iter->getMyStatus();
    switch(status)
    {
       case DEAD: 
            ... do some stuff here. 
            break;

       case ALIVE:
            ..... do some stuff here ... 

    }
}

このコードは「HALFDEAD」で何をすべきですか? [これをサポートする架空の言語では]派生クラスにのみ存在するため、そのような値が存在することさえ知りません...

于 2013-06-17T20:57:46.087 に答える
1

あなたは近づくことができます:

constexpr STATE HALFDEAD = static_cast<STATE>(DEAD+1);

DEAD+1ただし、値 (上記) が他の列挙子と等しくないことを確認する責任があります。

于 2013-06-17T21:39:35.580 に答える