2012-03-10 33 views
1

這個奇怪的問題的QObject多重繼承和運營商新

爲什麼下面的代碼是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; 
} 

OK,這不能被編譯

/*... 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宏的問題,我想。

回答

3

如果你定義了一個QObject派生類,構建一個應用程序,並且意識到你忘了添加Q_OBJECT宏,並且稍後添加它,那麼重要的是你必須明確地更新Makefile。此外,爲了安全起見,我建議使用make clean來清除舊文件。 make在這種情況下不夠聰明,無法清理所有生成的文件,這是一個經常令新Qt開發人員頭痛的問題。

有關此錯誤消息的詳細信息,請參閱

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

+0

有趣的鏈接,謝謝。 +1。我認爲這與問題有關。 「全內聯類 對於多態類[72],該頭文件的源(.cpp)文件中至少應有一個非內聯定義(函數或靜態成員)。將無法找到任何虛擬方法定義,並會報告類似的錯誤。 全內聯類在C++中是合法的,但是它們在與多態混合時無法以其預期的方式工作。我想這可能是發生了什麼,因爲提問者提到.cpp文件有幫助。 – tmpearce 2012-03-10 06:16:25

+0

@tmpearce thanx for your reply ... – shofee 2012-03-10 06:29:25

+0

謝謝,當我添加從QObject繼承的另一個類並重建項目時,我從工作項目中擺脫了我真正的問題(我在此建模)。奇怪,但它有幫助。 – 2012-03-10 06:39:41

3

爲什麼第一個例子編譯&乾淨的連接而第二個不?

第一示例編譯和鏈接因爲:
它不創建的A一個對象,

A a1(); 

聲明一個函數a1()它沒有任何參數和返回A類型。

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

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

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

+0

爲什麼第一個作品呢? – 2012-03-10 05:49:43

+0

哦,是的,我現在看到 – 2012-03-10 05:53:54

+1

QObject不是純虛擬的;沒有什麼你需要*來提供一個定義。 – tmpearce 2012-03-10 05:55:06

0

代碼工作中可見。工作室。你的問題可能是B不是一個多態類 - 我不知道爲什麼會給你一個錯誤 - 但你可以嘗試在B虛擬:virtual ~B(){}例如。