C++ class 原型无法正常工作?

C++ class prototype not working properly?

我正在尝试创建一个 class 原型,但我一直收到错误消息:'aClass' 使用未定义的 class 'myClass'

我很确定我正在正确制作原型。使用原型函数有效,但 class 原型无效。

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;
}

myClass aClass;是一个定义,要求myClass是一个complete typemyClass 的大小和布局必须在编译时知道。

Any of the following contexts requires class T to be complete:

  • ...
  • definition of an object of type T;
  • ...

这意味着 class 必须在此之前定义。

请注意,前向声明适用于不需要类型完整的情况,例如指向类型的指针的定义(如 myClass* p;)。

对于函数来说,情况就不同了。一个函数是 odr-used 如果对它进行函数调用,那么它的定义必须存在于某处。请注意,编译时不需要定义,在 main() 之后定义它(之前声明)就可以了。

a function is odr-used if a function call to it is made or its address is taken. If an object or a function is odr-used, its definition must exist somewhere in the program; a violation of that is a link-time error.


顺便说一句:在 class 的前向声明中使用 extern 是多余的。