前进声明并一步使用

时间:2016-04-21 03:39:48

标签: c++

作为优化,或者为了避免包含循环,可以向前声明类型,这导致代码如下:

class A;

class B
{
    A *a;
};

如果前向声明的数量变大,则会占用头文件顶部的大量空间。有没有一种方法可以同时向前声明和使用?有点像:

class B
{
    extern A *a;
};

我之前从未真正考虑过这个问题,但是我有一个带有一堆前向声明的标题,我想让它更整洁(没有将它们转移到另一个包含文件中)。

编辑:我将'a'更改为指针,因为它正确地指出你只能在指针和引用上使用前向声明。

3 个答案:

答案 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关于前向声明应该给你所有的血腥细节,但总的来说,如果你想使用它,你需要一个类型的完整定义(包括或多或少);不只是它存在的事实(正如前面声明的更多或更少)。