1

被这个奇怪的问题困住了

为什么以下代码适用于 g++

#include <QObject>

class B {
public:
  B(){}
  ~B(){}
};

class A : public QObject, public B {
  Q_OBJECT
public:
  A(QObject * parent = 0 ) : QObject( parent ), B() {}
  ~A(){}
};

int main(int argc, char *argv[])
{
  A a1();
  //A * a = new A();
  //delete a;
  return 0;
}

这无法编译

/*... the same class definitions as above */    

int main(int argc, char *argv[])
{
  //A a1();
  A * a = new A();
  delete a;
  return 0;
}

//error: undefined reference to `vtable for A'

我的意思是怎么做才能使第二个也好?

PS好吧,我将所有内容放在单独的文件中,并且效果很好。所以我认为这是 Q_OBJECT 宏的问题。

4

3 回答 3

3

为什么第一个示例可以干净地编译和链接,而第二个没有?

第一个示例编译和链接,因为:
它没有创建A,

A a1();

声明一个a1()不带参数并返回A类型的函数。

而第二个示例在new调用时创建了一个对象。

请注意,vtable for A'* is a linking error and will only be emitted when a object of创建了对 A 类的 *undefined 引用。因此,只有第二个示例显示了错误。

如何解决问题?
您需要为您从中派生的所有虚函数提供定义QObject

于 2012-03-10T05:48:19.330 回答
3

如果您定义了一个 QObject 派生类,构建了一个应用程序,并意识到您忘记添加 Q_OBJECT 宏,并且您稍后添加它,那么您 qmake 显式更新 Makefile 是很重要的。此外,为了安全起见,我建议使用 make clean 来删除旧文件。在这种情况下,make 不够聪明,无法清理所有生成的文件,这是一个经常让新 Qt 开发人员头疼的问题。

有关此错误消息的详细信息,请参阅

http://cartan.cas.suffolk.edu/oopdocbook/html/commonlinkererrors.html#undefinedreftovtable

于 2012-03-10T05:50:37.013 回答
0

该代码在 Vis 中工作。工作室。你的问题可能是它B不是一个多态类 - 我不知道为什么这会给你一个错误 - 但你可以尝试在B虚拟中制作一些东西:virtual ~B(){}例如。

于 2012-03-10T05:53:28.273 回答