我正在尝试创建一个类原型,但是我不断收到错误:'aClass'使用未定义的类'myClass'
我很确定我正在制作原型。使用原型函数可以工作,但是类原型没有。
extern class myClass; // prototypes
extern void myFunction();
int main() // main
{
myClass aClass;
myFunction();
return 0;
}
class myClass { // this doesn't work
public:
void doSomething() {
return;
}
myClass() {};
};
void myFunction() { // this works
return;
}
答案 0 :(得分:6)
myClass aClass;
是一个定义,要求myClass
为complete type;在编译时,必须知道myClass
的大小和布局。
以下任何一种情况都要求T级完成:
- ...
- T类对象的定义;
- ...
这意味着必须在此之前定义类。
请注意,正向声明适用于那些不要求类型完整的情况,例如:指向类型的指针的定义(如myClass* p;
)。
对于功能而言,故事是不同的。函数是odr-used如果对其进行函数调用,则其定义必须存在于某处。请注意,在编译时不需要该定义,在main()
(之前声明)之后定义它是正常的。
如果对函数进行了函数调用或者对其执行了地址,则函数会被使用。如果一个对象或函数使用了odr,它的定义必须存在于程序的某个地方;违反这一点的是链接时错误。
BTW:在类的前向声明中使用extern
是多余的。