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

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


当前回答

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

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

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

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

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

其他回答

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

当您希望使用其他类型(类)作为类的成员时,通常需要在类头文件中使用正向声明。你不能在头文件中使用前向声明的类方法,因为c++还不知道那个类的定义。这就是你必须移动到. cppp文件的逻辑,但如果你使用的是模板函数,你应该将它们减少到只使用模板的部分,并将该函数移动到头文件中。

主要规则是,只能前向声明那些内存布局(以及成员函数和数据成员)不需要在前向声明的文件中知道的类。

这将排除基类和任何通过引用和指针使用的类。

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

在文件中,只使用指向类的指针或引用。指针/引用不能调用任何成员/成员函数。

//前向声明

我们可以声明类型为Foo*或Foo&的数据成员。

我们可以声明(但不能定义)带有Foo类型的参数和/或返回值的函数。

可以声明类型为Foo的静态数据成员。这是因为静态数据成员定义在类定义之外。