【问题标题】:Forward declaration of nested enum嵌套枚举的前向声明
【发布时间】:2010-02-10 15:51:48
【问题描述】:

我有类似下面的代码:

class B
{
}

class A
{
  enum {
     EOne,
     ETwo
  } EMyEnum;

  B myB;
}

我想在 B 类(在 A 之前声明)中声明 EMyEnum 类型的成员。这可能吗?我意识到解决方案是先声明 B 类,但为了清楚起见,我不想这样做。

【问题讨论】:

标签: c++ enums nested forward-declaration


【解决方案1】:

这是不可能的......但它可以通过继承滥用来伪造:)

namespace detail
{
  class A_EMyEnum
  {
  public:
    enum {
       EOne,
       ETwo
    } EMyEnum;

  protected:
    A_EMyEnum() {}
    A_EMyEnum(const A_EMyEnum&) {}
    A_EMyEnum& operator=(const A_EMyEnum&) { return *this; }
    ~A_EMyEnum() {}
  }; // class A_EMyEnum
} // namespace detail

class B { // use detail::A_EMyEnum };

class A: public detail::A_EMyEnum
{

  B mB;
};

另一方面...你为什么不简单地转发声明 B ?

class B;

class A
{
public:
  enum EMyEnum {};

  A();
  A(const A&);
  A& operator=(const A&);
  ~A();
  void swap(A&);

private:
  B* mB;
};

class B { // use A::EMyEnum };

当然,您需要实际编写 A 的所有通常“默认生成”的方法,但是,这并不需要花费太多!

【讨论】:

  • 是的,后者是我最终做的。只需要确认我的偏好是不可能的:)
  • enum {} EMyEnum 是什么意思?我以前从来没有遇到过?
  • @Olumide:它包含两个从 C 继承的奇怪的 nits。首先,在 C 中,您可以立即实例化一个 structenumstruct X { int x; } myX; 声明了一个变量 myX,类型为 @987654328 @。其次,在 C 语言中,您可以省略 structenum 名称,从而创建一个匿名类型。在enum 上经常使用它来声明 C 中的常量:enum { CONSTANT_A = 12, CONSTANT_B = 42 }; 但也可以与第一个 nit 组合以创建匿名类型的变量。显然,在这个问题的特定背景下,这可能不是预期的......
【解决方案2】:

当前的 C++ 标准不允许前向声明 enums,尽管它们将出现在即将到来的 C++0x 标准中。

请参阅here 了解更多信息。

【讨论】:

    【解决方案3】:

    您可以将 A 声明为 B 的模板参数。 解决它的第二种方法是使用 int - 众所周知,c++ enum 是 int。

    【讨论】:

    • 只有 C 语言才知道,在当前的 C++ 中,每个整数类型都可能由编译器发出。
    • @phresnel 你是对的,但我的意思是它无论如何都可以转换为 int
    猜你喜欢
    • 2011-11-20
    • 2013-02-14
    • 2023-03-27
    • 2010-09-09
    • 2010-10-31
    • 1970-01-01
    相关资源
    最近更新 更多