如何在 class 主体中转发声明未嵌套的 class 而无需友好或声明指针

How to forward-declare unnested class in a class body without befriending or declaring pointer

我知道在 class 体内声明非嵌套 class 的两种方法。

首先是:

class A
{
    friend class B; // B is forward-declared + friend
};

第二个是:

class A
{
    class B* ptr; // B is forward-declared + pointer
};

可以在 class 主体外转发声明一个 class,但出于某些原因让我们忘记这个选项;

所以,我想声明这样的成员:

class A
{
    /* somehow declare B in the body*/
    B* getInstanceB();
};

值得一提的是: 声明一个指针:

class A
{
    class B* pointer;
    B* getInstanceB(); //fine
};

有好友声明:

class A
{
    friend class B;
    B* getInstanceB(); //GCC 5.3.0 issues error, MSVC compiles
};

我深感遗憾没有像这样的前向声明语法:

class ::[optional-namespace::]ClassName

这将区分嵌套的 class 前向声明和未嵌套的 class 前向声明。是否可以通过其他方式在当前标准中做到这一点?

所以你想要做的是在另一个 class 中有一个 class 的实例,但在 "container class" 之后有定义?

//forward declaration of B
class B;

class A
{
  public:
    B* getInstanceB();

  private:
     B b_;

};

B* A::getInstanceB()
{
   return &b_;
}

//implementation of B
class B{};

像这样?

HTH

I deeply regret that there is no such forward-declaring syntax like:

class ::[optional-namespace::]ClassName;

which would distinguish nested class forward-declaration from unnested class forward-declaration. Is it possible to do that in current standard in some other way?

不,我认为没有。

A 的 class 定义中前向声明名为 B 的 class,而无需将 class 嵌套在 [=12= 中],您可以执行以下操作:

class A {
    typedef class B B;
    // do something with B
};

可以找到解释

这确实有效的演示:http://coliru.stacked-crooked.com/a/27913ce45a572d36