2011-04-14 7 views
0

나는 구문 분석 라이브러리를 작성 중입니다. 그것은 Qt를 작성하고,이 같은 클래스 구조를 가지고 :
QCConstantNode -Constants 표현식에서
QCExpressionNode - 초록 기본 클래스 식의 모든 조각에 대한을 (확장 QCExpressionNode) 식의
QCVariableNode -Variables (QCExpressionNode)
QCBinaryOperatorNode -Binary 더하기, 빼기, 곱하기, 나누기 및 전력 사업자 (I 스마트 포인터를 (같은 QPointer 또는 QSharedPointer) 사용할 수 있도록 QCExpressionNode)QPointer 추상 기본 클래스

싶습니다 연장 확장,하지만 난 다음과 같은 문제를 겪고 있습니다.
- 추상적 클래스로 QPointer을 사용할 수 있습니까? 그렇다면 예제를 제공해주십시오.
QPointer을 구체적인 하위 클래스로 캐스팅하는 방법은 무엇입니까?

답변

3

당신이 이것을 할 수없는 이유가 보이지 않습니다.

class Parent : public QObject 
{ 
public: 
    virtual void AbstractMethod() = 0; 
}; 

class Child: public Parent 
{ 
public: 
    virtual void AbstractMethod() { } 

    QString PrintMessage() { return "This is really the Child Class"; } 
}; 

지금과 같은 QPointer 초기화 :이 예를 가지고

QPointer<Parent> pointer = new Child(); 

당신은 다음 '추상적 인'클래스에 메소드를 호출 할 수 있습니다 당신이 QPointer

pointer->AbstractMethod(); 

때와 평소처럼 원칙적으로 부모 클래스에 정의 된 추상 메소드로 필요한 모든 것을 액세스 할 수 있기 때문에 이것은 충분합니다.

그러나 실제로 하위 클래스를 구별해야하거나 자식 클래스에만있는 것을 사용하려면 dynamic_cast를 사용할 수 있습니다.

Child *_ChildInstance = dynamic_cast<Child *>(pointer.data()); 

// If _ChildInstance is NULL then pointer does not contain a Child 
// but something else that inherits from Parent 
if (_ChildInstance != NULL) 
{ 
    // Call stuff in your child class 
    _ChildInstance->PrintMessage(); 
} 

도움이 되었기를 바랍니다.

추가 참고 사항 : QPointer에 실제로 무언가가 포함되어 있는지 확인하려면 pointer.isNull()도 확인해야합니다.

+0

'qobject_cast'를 사용할 수 있습니까? 그리고 QPointer 처럼'QCExpressionNode_ptr'와 같은 typedef를 사용할 수 있습니까? –

+1

qobject_cast에 대한 @Nathan Moos 문서는 "qobject_cast() 함수는 표준 C++ dynamic_cast()"와 비슷하게 동작하므로 yes로 작동해야한다고 가정합니다. 그리고 typedef QPointer를 추가하려고했습니다. Parentptr; 매번 그것을 선언하는 대신 그것을 사용하면 효과가있다. 네, 그렇게 할 수 있습니다. – Liz

+0

감사합니다. 그게 내 질문에 완전히 대답했다. –