2011-03-23 77 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