作为优化,或者为了避免包含循环,可以向前声明类型,这导致代码如下:
class A;
class B
{
A *a;
};
如果前向声明的数量变大,则会占用头文件顶部的大量空间。有没有一种方法可以同时向前声明和使用?有点像:
class B
{
extern A *a;
};
我之前从未真正考虑过这个问题,但是我有一个带有一堆前向声明的标题,我想让它更整洁(没有将它们转移到另一个包含文件中)。
编辑:我将'a'更改为指针,因为它正确地指出你只能在指针和引用上使用前向声明。
答案 0 :(得分:5)
您所询问的内容并不完全清楚,但如果我理解正确,您可以同时声明 宣布您的变量:
class B
{
class A* a; // declaring A as class is an in-place forward declaration
};
这是你的意思吗?
答案 1 :(得分:4)
前瞻声明不允许你做
class A;
class B
{
A a;
};
除非A
是引用或指针类型,因为前向声明不提供有关对象大小的任何其他信息(除非在C ++ 11中为enum class
)。所以你使用指针/引用?否则,这意味着您肯定会包含A
的定义。
关于你的问题,没有办法转发声明和使用类型,因为我们正在谈论两个不同的事情。变量声明不定义类型,它定义变量。
解决问题的一个简单方法是在单个头文件中收集所有前向声明,并将其包含在项目中(或最终的预编译头文件中)。这不会产生太多问题,因为前向声明不会暴露任何东西,也不会是重量级的。
答案 2 :(得分:3)
不,你不能做你想做的事。 This answer关于前向声明应该给你所有的血腥细节,但总的来说,如果你想使用它,你需要一个类型的完整定义(包括或多或少);不只是它存在的事实(正如前面声明的更多或更少)。