2011-03-23 4 views
0

표현식을 트리 구조로 구문 분석하기위한 라이브러리를 작성하고 있으며 기본 클래스로 추상 유형 QCExpressionNode을 사용하고 있습니다. 나는 몇 가지 테스트 (등 QCConstantNode, QCVariableNode, QCBinaryOperatorNode 등) (QtCreator에서 다른 프로젝트) 서브 클래스에 그 일을 컴파일 할 때추상 클래스 (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 

, 링커가 나에게 'vtable에 정의되지 않은 참조를'제공 : 그것은 다음과 같습니다 QCExpressionNode에 대한 오류. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

0

이면 파일은 올바르게 컴파일되어야합니다. Q_DECLARE_INTERFACEQtPlugin에 선언되어 있습니다.

그건 그렇고 : 헤더 파일 자체를 컴파일하는 것은 아주 드문 일이며, 헤더 파일 외부에 가드를 포함시키는 것은 드문 경우입니다.

+0

저는 C++ 및 Qt 개발에 익숙하지 않으므로 실제로 그 상황에서 헤더 파일이 어떻게됩니까? –

+0

@Oswald : 헤더 파일을 컴파일하는 데 꽤 쓸데 없지만 * 그는 외부의 가드를 포함하지 않습니다. 일반적으로 "프록시"헤더를 "소스"파일에'#include '하여 헤더를 컴파일합니다. 소스 파일은 컴파일러 단계에서 사전 처리 된 나머지 부분을 먹습니다. 그래도 그게 어떻게 관련이 있는지 모르겠다. –

+0

'Q_DECLARE_INTERFACE'가 확장되는 것을 알지 못하는 것 외에도 클래스가 완전히 정의되어 있고 컴파일하면 다른 C++ 파일에 정의 된 것처럼 오브젝트 코드가 생성되어야합니다. 헤더 파일이 그런 식으로 사용되지 않는다는 것입니다. 헤더 파일은 정의를 다른 파일에 알리기 위해 다른 파일에 포함됩니다. 많은 다른 소스 파일에서'QCExpressionNode' 유형의 객체를 사용하려는 경우 유용합니다. – Oswald

관련 문제