2011-03-23 37 views
0

我正在寫一個解析表達式到一個樹結構的庫,我有一個抽象類型QCExpressionNode作爲我的基類。它看起來像這樣:抽象類(Qt)的'未定義引用vtable'

#ifndef QCEXPRESSIONNODE_H 
#define QCEXPRESSIONNODE_H 

#include <QString> 

class QCExpressionNode 
{ 
public: 
    virtual ~QCExpressionNode() {} 

    virtual float evaluate(float* x) = 0; 
    virtual bool containsVariable() = 0; 
    virtual QString infixNotation() = 0; 
}; 

Q_DECLARE_INTERFACE(QCExpressionNode, "org.nathanmoos.qcalc.libexprtree-qt.QCExpressionNode/0.1") 

#endif // QCEXPRESSIONNODE_H 

當我編譯一些測試(在QtCreator另一個項目)的子類的工作(QCConstantNodeQCVariableNodeQCBinaryOperatorNode,等等),鏈接給我一個未定義引用的vtable「 QCExpressionNode錯誤。我究竟做錯了什麼?

回答

0

#include <QtPlugin>,那麼文件應該編譯得很好。在QtPlugin中聲明 Q_DECLARE_INTERFACE。順便說一句:它自己編譯頭文件是非常不尋常的,而在頭文件之外包含頭文件是很少見的。

+0

我不熟悉C++和Qt開發,那麼在這種情況下實際發生的頭文件是什麼? – 2011-03-23 00:51:01

+0

@Oswald:這是非常沒用的*不*編譯頭文件,並且他沒有一個以外的包括守衛。通常情況下,你需要編寫一個「通過代理」的頭文件,通過#include將其包含在一個「源」文件中,該文件的預處理後的剩餘部分被編譯器階段所佔用。不過,我不明白這與此有關。 – 2011-03-23 00:56:25

+0

除了我不知道Q_DECLARE_INTERFACE擴展到什麼外,您的類是完全定義的,編譯它應該會導致目標代碼,就像它在任何其他C++文件中定義一樣。這只是頭文件沒有這樣使用。頭文件包含在其他文件中以使其定義知道其他文件。如果你想在許多其他源文件中使用'QCExpressionNode'類型的對象,這就派上用場了。 – Oswald 2011-03-23 00:57:32