如何在 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
我知道在 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