嵌套枚举的前向声明

发布于 2024-08-21 04:06:47 字数 207 浏览 5 评论 0原文

我有类似于以下内容的代码:

class B
{
}

class A
{
  enum {
     EOne,
     ETwo
  } EMyEnum;

  B myB;
}

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

I have code similar to the following:

class B
{
}

class A
{
  enum {
     EOne,
     ETwo
  } EMyEnum;

  B myB;
}

I want to declare a member of type EMyEnum in class B (which is declared before A). Is this possible? I realise the solution is to declare class B second, but for clarity I would prefer not to.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情域 2024-08-28 04:06:47

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

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 的所有通常“默认生成”的方法,但是嘿,这并没有花费那么多!

It's not possible... but it can be faked with inheritance abuse :)

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;
};

On the other hand... why don't you simply forward declare 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 };

Sure you need to actually write all the normally "default generated" methods of A, but hey that does not cost so much!

心是晴朗的。 2024-08-28 04:06:47

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

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

The current C++ standard does not allow forward declarations of enums, although they will be coming in the upcoming C++0x standard.

See here for more info.

橙幽之幻 2024-08-28 04:06:47

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

You can declare A as template paramater of B.
Second way to solve it is using int - it is known that c++ enum is int.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文