簡體   English   中英

QObject多重繼承和運算符new

[英]QObject multiple inheritance and operator new

陷入這個奇怪的問題

為什么以下代碼對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宏的問題。

為什么第一個示例不能干凈地編譯並鏈接而第二個示例卻不能干凈地編譯?

第一個示例編譯和鏈接是因為:
它不會創建A的對象。

A a1();

聲明一個不帶參數且返回A類型的函數a1()

而第二個示例在調用new時創建一個對象。

請注意,* vtable for A'* is a linking error and will only be emitted when a object of未定義引用vtable for A'* is a linking error and will only be emitted when a object of創建類A` vtable for A'* is a linking error and will only be emitted when a object of 因此,只有第二個示例顯示了錯誤。

如何解決問題?
您需要為從QObject派生的所有虛函數提供定義。

如果定義了QObject派生的類,構建了一個應用程序,並且意識到您忘記添加Q_OBJECT宏,而后又添加了它,則qmake顯式更新Makefile很重要。 此外,為了安全起見,我建議進行清理以清除舊文件。 在這種情況下,make不夠聰明,無法清理其所有生成的文件,這是一個經常引起新Qt開發人員頭痛的問題。

有關此錯誤消息的更多信息,請參見

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

該代碼在Vis中有效。 工作室。 您的問題可能是B不是一個多態類-我不知道為什么這會給您帶來錯誤-但您可以嘗試使用B虛擬方法制作一些東西:例如virtual ~B(){}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM