2

例えば:

基本クラスのヘッダー ファイルには次のものが含まれます。

enum FOO
{
FOO_A,
FOO_B,
FOO_C,
FOO_USERSTART
};

次に、派生クラスには次のものがあります。

enum FOO
{
FOO_USERA=FOO_USERSTART
FOO_USERB,
FOO_USERC
};

私の使用法を明確にするために、基本クラスにイベントがあり、派生クラスがイベントを追加できるイベントハンドラーを持つためです。派生クラスのイベント ハンドラーはそのイベントをチェックし、イベントがそれに対するものでない場合は、イベントを基本クラスに渡します。

class Base
{
public:
    virtual void HandleFoo(FOO event);
};

class Derived: public Base
{
public:
    void HandleFoo(FOO event);
};


void Base::HandleFoo(FOO event)
{
     switch(event)
     {
     case FOO_A:
       /* do stuff */
     break;
     case FOO_B:
       /* do stuff */
     break;
     case FOO_B:
       /* do stuff */
     break;
     }
 }

void Derived::HandleFoo(FOO event)
{
     switch(event)
     {
     case FOO_USERA:
       /* do stuff */
     break;
     case FOO_USERB:
       /* do stuff */
     break;
     case FOO_USERB:
       /* do stuff */
     break;
     default:
          /* not my event, must be for someone else */
          Base::HandleFoo(event);
     break;
     }
 }
4

3 に答える 3

2

いいえ。コンパイラは、} を確認したら、enum が char、short、int、または long のいずれに収まるかを判断できる必要があります。

したがって、基本クラスのヘッダーに

enum Foo {
  A,
  B,
  MAX = 1<<15
};

コンパイラは、列挙型が 16 ビットに収まるかどうかを判断する場合があります。たとえば、基本クラスをレイアウトするときに、それを使用できます。後で列挙型に 1<<31 を追加できた場合、基本クラスの列挙型メンバーは列挙値の 1 つを保持できません。

于 2008-11-06T10:46:02.447 に答える
2

はい、列挙型が両方ともクラスのメンバーである限り。そうでない場合、それらは同じ型になり、コンパイラは非常に不幸になります。

于 2008-11-06T01:23:09.167 に答える
0

はい、これは機能します。コードを少し単純化するために、列挙型を「拡張」するより一般的な方法をお勧めします。

enum FOO // Base class's FOO
{
FOO_A,
FOO_B,
FOO_C,
FOO_BASE_MAX // Always keep this as the last value in the base class
};

enum FOO // Derived class's FOO
{
FOO_USERA=FOO_BASE_MAX+1, // Always keep this as the first value in the derived class
FOO_USERB,
FOO_USERC
};

「順不同」の列挙型に注意する必要があります。(例: FOO_A=15、FOO_B=11 など)

于 2008-11-06T19:33:21.727 に答える