2011-08-18 52 views
4

下面是一個正常工作現在類具有虛擬功能,從繼承自QObject時,會導致連接錯誤

class HttpService { 
public: 
    virtual ~HttpService(); // implemented in .cpp 
protected: 
    HttpService(struct MHD_Connection *conn) {} 
}; 
class HttpFileService : public HttpService 
{ 
public: 
    virtual ~HttpFileService() ; // implemented in .cpp 
protected: 
    HttpFileService(struct MHD_Connection *conn) : HttpService(conn) {} 
}; 

的代碼,當我提出HttpService派生類的QObject,象下面這樣:

#include <QObject>      // change #1 
class HttpService : public QObject { // change #2 
    Q_OBJECT       // change #3 
public: 
    virtual ~HttpService(); 
protected: 
    HttpService(struct MHD_Connection *conn) {} 
}; 

class HttpFileService : public HttpService { 
    Q_OBJECT       // change #4 
public: 
    virtual ~HttpFileService() ; 
protected: 
    HttpFileService(struct MHD_Connection *conn) : HttpService(conn) {} 
}; 

我遇到以下鏈接錯誤:

Undefined symbols for architecture x86_64: 
    "vtable for HttpService", referenced from: 
     HttpService::~HttpService()in httpservice.o 

更改HttpService的構造以下內容並沒有幫助

explicit HttpService(QObject *parent = 0) : QObject(parent) 
+1

代碼更改後,'〜HttpService()'仍然在'.cpp'文件中實現?我問這是因爲,在更改後的代碼中,我沒有看到註釋爲「//在.cpp中實現」。 – iammilind

+0

@iammilind,是的,它仍然是。唯一被更改的行在註釋中突出顯示 –

+2

是否是整個'HttpService()'?如果我在一個抽象基類中聲明瞭一個虛函數,我經常會看到這個錯誤,並且忘記將其變爲純文本。 (gcc在與第一個非純的非內聯虛函數相同的目標文件中生成vtable,如果聲明瞭這樣的函數,並且沒有定義,那麼它最終會丟失)。 –

回答

9

強制運行qmake並查看它是否有效。

+0

哇!

1

你鏈接到正確的Qt庫?

+0

是的,在我的項目中還有其他的QObject派生類正在經歷很好 –

0

你在調用moc編譯器嗎?如果沒有,請刪除Q_OBJECT宏!你是否包含/鏈接moc-compilation的結果?