在C ++中:是否可以在不同的文件中继续使用命名枚举?

时间:2008-11-06 01:10:11

标签: c++ enums continue

例如:

基类头文件包含:

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 个答案:

答案 0 :(得分:2)

是的,只要枚举都是一个类的成员。如果它们不是那么它们将是相同的类型,并且编译器会非常不满意。

答案 1 :(得分:2)

没有。编译器需要能够在看到}时确定枚举是否适合char,short,int或long。

所以如果基类头有

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

编译器可以将枚举拟合为16位。然后它可以使用它,例如在布置基类时。如果您以后能够在枚举中添加1&lt;&lt; 31,则基类枚举成员将无法保存其中一个枚举值。

答案 2 :(得分: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等)