【问题标题】:forward declaration of enum in base class, definition in derived class基类中枚举的前向声明,派生类中的定义
【发布时间】:2015-11-15 15:19:56
【问题描述】:

所以,我试图在派生类中定义一个枚举,其中声明位于基类中。它看起来像这样:

class A {
    public:
    enum class E;
    virtual int foo () = 0;
};

class B : public A {
    public:
    enum class E { C, D };
    int foo () {
        E e = E::C;
        return 0;
    }
};

int main() {
    B b;
    A *a = &b;
    a->foo();
}

这会起作用(编译器 gcc 4.8,编译命令:g++ -std=c++11 ...)但是我想知道是否有更好的方法来做到这一点,这样我就不必写 E :: 每次我必须使用枚举时。

编辑:我错误地认为这可行,但是,这并不是真正的前向声明,而是两个不同的枚举类 A::E 和 B::E

【问题讨论】:

  • 我不必每次必须使用枚举时都写 E:: -- 然后使用旧的 enum 而不是 enum class
  • 为什么需要在基类中声明?
  • 那个前锋有什么作用吗?您声明有一个 A::E,然后您不使用它。这可能与您随后定义的 B::E 无关
  • @sp2danny 是的,看来您是正确的。有哪些方法可以在基类中转发声明枚举并在派生类中定义它?
  • 没有,据我所知。类型不是虚拟的。

标签: c++11 enums forward-declaration


【解决方案1】:

我想知道是否有更好的方法来做到这一点,这样我就不必每次必须使用枚举时都写 E::。

这与前向声明无关。你必须写E::,因为你使用enum class
如果您不想要这个,请改用旧的enum

class B : public A {
    public:
    enum E { C, D };
    // ...
};

【讨论】:

  • 感谢您的回答,但是,我如何转发声明旧枚举?我需要前向声明,以便其他派生类可以根据自己的喜好定义 E。
【解决方案2】:

您要完成的工作并不完全清楚。 enum 定义了一个类型,因此每次定义 enum 时,您都会定义一个新类型。这些类型之间没有关系,而类是少数几个在它们之间有关系的类型之一。

所以,如果你有以下两个类,

class A {

  public:

    enum class E {
      X,
      Y
    };

 };

class B : public A {

  public:

    enum class E {
      V,
      W
    };

 };

A::EB::E 类型是不同的类型。不管类层次如何,它们之间没有任何关系。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多