В C ++: возможно ли продолжить именованное перечисление в другом файле? - PullRequest
2 голосов
/ 06 ноября 2008

Например:

Файл заголовка базового класса имеет:

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

Ответы [ 3 ]

2 голосов
/ 06 ноября 2008

Нет. Компилятор должен иметь возможность решить, подходит ли перечисление в char, short, int или long, когда увидит}.

Так что, если заголовок базового класса имеет

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

компилятор может решить, что перечисление соответствует 16 битам. Затем он может использовать это, например, при выкладке базового класса. Если позже вы сможете добавить 1 << 31 в перечисление, член перечисления базового класса не сможет содержать одно из значений перечисления. </p>

2 голосов
/ 06 ноября 2008

Да, если перечисления являются членами класса. Если бы их не было, они бы были одного типа, а компилятор был бы очень недоволен

0 голосов
/ 06 ноября 2008

Да, это работает. Чтобы немного упростить ваш код, я бы предложил этот, более распространенный метод «расширения» перечислений:

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 и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...