只要稍后在翻译单元中定义,就可以声明一个类而不定义它(前向声明).在函数的情况下,可以声明函数而不在转换单元中定义它,并且链接器将其链接到其在不同转换单元中的定义.是否有可能对类声明做同样的事情?
(如果这不可能,对于在当前TL中没有定义的前向声明的类有什么用处,还是总是出错?)
像这样的东西,除了这不编译:
mymain.cpp:
class myclass; // declare without defining
myclass::myclass();
void myclass::barf();
int main() {
myclass *m = new myclass();
m->barf();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
myclass.cpp:
#include <iostream>
class myclass { // define the implementation
public:
myclass();
void barf();
};
myclass::myclass() { } //empty constructor
void myclass::barf() {
std::cout << "barfing\n";
}
Run Code Online (Sandbox Code Playgroud)
可以向前声明一个类,但只能使用指向前向声明的类的指针和引用.你不能使用前向声明类的实际对象,因为编译器对它不够了解; 特别是它不知道对象有多大或者成员是什么.尝试转发声明成员函数(正如您所做的那样)将无法工作,因为前向声明的语法不允许您指定函数是虚函数还是非虚函数(或者可能是从某个基类继承的).
在源文件中转发声明类通常不常用,但它在头文件中很有用.特别是在库的公共头文件中转发声明一个类并使用指向该类型的指针作为不透明句柄是很常见的.类定义对库来说是私有的,但是用户代码可以传递指向该类对象的指针,而不知道类的实现是什么样的.当指针是智能指针时,这种方法特别有效.