在一个步骤中转发声明和使用

Forward declaring and using in one step

本文关键字:转发 声明 一个      更新时间:2023-10-16

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

class A;
class B
{
    A *a;
};

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

class B
{
    extern A *a;
};

我以前从未真正想过这一点,但我有一个包含一堆前向声明的标题,我想让它更整洁(而不是将它们转换为另一个包含文件)。

编辑:我把"a"改成了指针,因为有人正确地指出,你只能在指针和引用上使用前向声明。

您的要求并不完全清楚,但如果我理解正确,您可以在声明变量的同时转发声明

class B
{
    class A* a; // declaring A as class is an in-place forward declaration
};

你是这个意思吗?

正向声明不允许进行

class A;
class B
{
    A a;
};

除非A是引用或指针类型,因为正向声明不会提供任何关于对象大小的附加信息(除非是C++11中的enum class)。那么你在使用指针/引用吗?否则,这意味着您肯定包含了A的定义。

关于你的问题,没有办法向前声明和使用类型,因为我们谈论的是两件不同的事情。变量声明不是定义类型,而是定义变量。

解决问题的一个简单方法是将所有正向声明收集到一个单独的头文件中,并将其包含在项目中(或最终的预编译头中)。这不会造成太多问题,因为前瞻性声明不会暴露任何内容,也不是重量级的。

不,你不能随心所欲。这个关于正向声明的答案应该会给你所有血腥的细节,但总的来说,如果你想使用一个类型,你需要它的完整定义(包括或多或少的定义);而不仅仅是它存在的事实(正如正向声明或多或少所做的那样)。