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

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

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

    例如:

    基类头文件具有:

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

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

    所以如果基类头

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

    编译器可以决定枚举适合16位。然后它就可以使用它,例如,在布置基类时。如果以后能够向枚举中添加1<<31,则基类枚举成员将无法保存其中一个枚举值。

        2
  •  2
  •   Mark Kegel    16 年前

    是的,只要枚举都是类的成员。如果不是这样,它们将是相同的类型,编译器将非常不高兴。

        3
  •  0
  •   Marcin    16 年前

    是的,这很管用。为了简化您的代码,我建议使用这种更常见的“扩展”枚举方法:

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