17

我有类似于以下的代码:

class B
{
}

class A
{
  enum {
     EOne,
     ETwo
  } EMyEnum;

  B myB;
}

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

4

3 回答 3

11

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

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 的所有通常“默认生成”的方法,但是,这并不需要太多成本!

于 2010-02-11T13:54:29.983 回答
2

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

请参阅此处了解更多信息。

于 2010-02-10T15:54:44.460 回答
0

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

于 2010-02-10T15:57:27.610 回答