我正在寻找当我被允许在另一个类的头文件中做类的前向声明的定义:

我是否可以为基类,为作为成员持有的类,为通过引用传递给成员函数的类,等等这样做?


当前回答

正如Luc Touraille已经很好地解释了在哪里使用和不使用类的前向声明。

我再补充一下为什么我们需要用它。

我们应该尽可能使用Forward声明,以避免不必要的依赖注入。

由于#include头文件被添加到多个文件中,因此,如果我们将一个头文件添加到另一个头文件中,它将在源代码的各个部分添加不必要的依赖注入,这可以通过尽可能将#include头文件添加到.cpp文件中来避免,而不是添加到另一个头文件中,并在头文件.h文件中尽可能使用类前向声明来避免。

其他回答

正如Luc Touraille已经很好地解释了在哪里使用和不使用类的前向声明。

我再补充一下为什么我们需要用它。

我们应该尽可能使用Forward声明,以避免不必要的依赖注入。

由于#include头文件被添加到多个文件中,因此,如果我们将一个头文件添加到另一个头文件中,它将在源代码的各个部分添加不必要的依赖注入,这可以通过尽可能将#include头文件添加到.cpp文件中来避免,而不是添加到另一个头文件中,并在头文件.h文件中尽可能使用类前向声明来避免。

我只是想补充一件重要的事情,你可以用Luc Touraille的回答中没有提到的转发类来做。

使用不完整类型可以做什么:

定义接受/返回的函数或方法 指向不完整类型的指针/引用并转发该指针/引用 到另一个函数。

void  f6(X*)       {}
void  f7(X&)       {}
void  f8(X* x_ptr, X& x_ref) { f6(x_ptr); f7(x_ref); }

模块可以将前向声明类的对象传递给另一个模块。

我遵循的一般规则是除非必须,否则不包含任何头文件。所以除非我将一个类的对象存储为我的类的成员变量,否则我不会包括它,我只会使用前向声明。

假定前向声明将使代码得到编译(obj被创建)。但是,除非找到定义,否则链接(exe创建)将不会成功。

只要不需要定义(比如指针和引用),就可以使用前向声明。这就是为什么大多数情况下你会在头文件中看到它们,而实现文件通常会为适当的定义拉出头文件。