我正在寻找当我被允许在另一个类的头文件中做类的前向声明的定义:
我是否可以为基类,为作为成员持有的类,为通过引用传递给成员函数的类,等等这样做?
我正在寻找当我被允许在另一个类的头文件中做类的前向声明的定义:
我是否可以为基类,为作为成员持有的类,为通过引用传递给成员函数的类,等等这样做?
当前回答
我遵循的一般规则是除非必须,否则不包含任何头文件。所以除非我将一个类的对象存储为我的类的成员变量,否则我不会包括它,我只会使用前向声明。
其他回答
正如Luc Touraille已经很好地解释了在哪里使用和不使用类的前向声明。
我再补充一下为什么我们需要用它。
我们应该尽可能使用Forward声明,以避免不必要的依赖注入。
由于#include头文件被添加到多个文件中,因此,如果我们将一个头文件添加到另一个头文件中,它将在源代码的各个部分添加不必要的依赖注入,这可以通过尽可能将#include头文件添加到.cpp文件中来避免,而不是添加到另一个头文件中,并在头文件.h文件中尽可能使用类前向声明来避免。
当您希望使用其他类型(类)作为类的成员时,通常需要在类头文件中使用正向声明。你不能在头文件中使用前向声明的类方法,因为c++还不知道那个类的定义。这就是你必须移动到. cppp文件的逻辑,但如果你使用的是模板函数,你应该将它们减少到只使用模板的部分,并将该函数移动到头文件中。
在文件中,只使用指向类的指针或引用。指针/引用不能调用任何成员/成员函数。
//前向声明
我们可以声明类型为Foo*或Foo&的数据成员。
我们可以声明(但不能定义)带有Foo类型的参数和/或返回值的函数。
可以声明类型为Foo的静态数据成员。这是因为静态数据成员定义在类定义之外。
主要规则是,只能前向声明那些内存布局(以及成员函数和数据成员)不需要在前向声明的文件中知道的类。
这将排除基类和任何通过引用和指针使用的类。
我遵循的一般规则是除非必须,否则不包含任何头文件。所以除非我将一个类的对象存储为我的类的成员变量,否则我不会包括它,我只会使用前向声明。