代码之家  ›  专栏  ›  技术社区  ›  KPexEA

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

  •  2
  • KPexEA  · 技术社区  · 17 年前

    例如:

    基类头文件具有:

    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 回复  |  直到 17 年前
        1
  •  2
  •   MSalters    17 年前

    不是。编译器需要能够在看到}后决定枚举是否适合char、short、int或long。

    因此,如果基类标头具有

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

    编译器可以确定枚举适合16位。然后,它可以使用它,例如在布局基类时。如果您稍后能够添加1<<31到枚举,基类枚举成员将无法保存枚举值之一。

        2
  •  2
  •   Mark Kegel    17 年前

    是的,只要枚举都是类的成员。如果它们不是,那么它们将是同一类型的,编译器会非常不高兴。

        3
  •  0
  •   Marcin    17 年前

    是的,这行得通。为了稍微简化你的代码,我建议使用以下更常见的“扩展”枚举的方法:

    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等)