【问题标题】:C++ class prototype not working properly?C++ 类原型不能正常工作?
【发布时间】:2017-11-22 02:37:45
【问题描述】:

我正在尝试创建一个类原型,但是我不断收到错误消息:'aClass' uses undefined class '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;
}

【问题讨论】:

  • extern class myClass; 没有任何意义。编译器可能已经告诉你了。
  • @user0042 那么为什么它适用于 myFunction 而不是 myClass?
  • 因为它们不同
  • 没有“类原型”这样的东西。 extern class MyClass; 是编译器应该诊断的错误。
  • 在主函数之前做一个空声明。我的班级;

标签: c++ class declaration definition forward-declaration


【解决方案1】:

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

以下任何一种情况都要求类 T 是完整的:

  • ...
  • T 类型对象的定义;
  • ...

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

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

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

如果对函数进行了函数调用或获取了函数的地址,则该函数是 odr-used。如果一个对象或一个函数被odr-used,它的定义必须存在于程序的某个地方;违反此规定是链接时错误。


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

【讨论】:

  • 因此不可能有一个类原型,因为一个类只定义了一次,即在 main() 之前。这就是我在这里阅读的内容吗?
  • @razorozx 对于这种情况,是的,myClass 必须在 main() 之前定义。请参阅添加到答案中的其他信息。
猜你喜欢
  • 2012-04-26
  • 2016-02-10
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多