只要稍后在翻译单元中定义,就可以声明一个类而不定义它(前向声明)。在函数的情况下,可以声明函数而不在转换单元中定义它,并且链接器将其链接到其在不同转换单元中的定义。是否有可能对类声明做同样的事情?
(如果这是不可能的,是否任何使用到当前TL中没有定义的前向声明的类,或者这总是错误?)
类似的东西,除了这不编译:
mymain.cpp:
class myclass; // declare without defining
myclass::myclass();
void myclass::barf();
int main() {
myclass *m = new myclass();
m->barf();
return 0;
}
myclass.cpp:
#include <iostream>
class myclass { // define the implementation
public:
myclass();
void barf();
};
myclass::myclass() { } //empty constructor
void myclass::barf() {
std::cout << "barfing\n";
}
答案 0 :(得分:6)
可以转发声明一个类,但只能使用指针和对前向声明的类的引用。你不能使用前向声明类的实际对象,因为编译器对它不够了解;特别是它不知道对象有多大或者成员是什么。尝试转发声明成员函数(正如您所做的那样)将不起作用,因为前向声明的语法不允许您指定函数是虚拟还是非虚拟(或者可能从某些基类继承)。
在源文件中转发声明类通常不常用,但它在头文件中很有用。特别是在库的公共头文件中转发声明一个类并使用指向该类型的指针作为不透明句柄是很常见的。类定义对库来说是私有的,但是用户代码可以传递指向该类对象的指针,而不知道类的实现是什么样的。当指针是智能指针时,这种方法效果特别好。
答案 1 :(得分:3)
您可以,但前提是您只使用指针或对该类的引用。但是你不能使用引用该类的成员(变量或方法)的代码。您只能使用它来向该类声明指针变量。
我建议你使用myclass'完整声明创建一个myclass.h
头文件,并在mymain.cpp
中包含该标题。
答案 2 :(得分:0)
你只能通过 hacks 来实现。
使用前声明规则不在类(see here)中保存。
否则,您可以通过将函数声明为模板函数来实现,模板函数的模板参数为myclass
(在您的示例中)。
唯一的非 hack 方法是定义类(即通过包含其定义的头文件)。