坚持这个奇怪的问题
为什么以下代码适用于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宏的问题,我想。
答案 0 :(得分:3)
为什么第一个例子编译&amp;干净地链接,而第二个没有?
第一个例子编译和链接,因为:
它不会创建A
,
A a1();
声明一个函数a1()
,它不带参数并返回A
类型。
虽然第二个示例在调用new
时创建了一个对象。
请注意,创建了vtable for A'* is a linking error and will only be emitted when a object of
A类的未定义引用。因此,只有第二个例子显示错误。
如何解决问题?
您需要为从QObject
派生的所有虚函数提供定义。
答案 1 :(得分:3)
如果你定义一个QObject派生类,构建一个应用程序,并意识到你忘了添加Q_OBJECT宏,并在稍后添加它,那么你必须qmake显式更新Makefile。此外,为了安全起见,我建议使用make clean来清除旧文件。在这种情况下,make不够聪明,无法清理所有生成的文件,这个问题经常会给新的Qt开发人员带来麻烦。
有关此错误消息的详细信息,请参阅
http://cartan.cas.suffolk.edu/oopdocbook/html/commonlinkererrors.html#undefinedreftovtable
答案 2 :(得分:0)
该代码适用于Vis。工作室。您的问题可能是B
不是多态类 - 我不知道为什么会给您一个错误 - 但您可以尝试在B
虚拟中创建一些内容:virtual ~B(){}