2011-04-14 150 views
0

我在寫一個表達式解析庫。 這是寫使用Qt,和我有一個類結構是這樣的:
QCConstantNode -Constants在表達
QCExpressionNode - 抽象基類的表達式的所有條(延伸QCExpressionNode
QCVariableNode - 變量在表達式(擴展QCExpressionNode
QCBinaryOperatorNode - 二進制加法,減法,乘法,除法和電力運營商(延伸QCExpressionNode抽象基類QPointer

我希望能夠使用智能指針(如QPointerQSharedPointer),但我我遇到以下挑戰:
可以使用抽象類來使用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(); 
} 

我希望有幫助。

特別提示:您還應該檢查pointer.isNull()以確保QPointer實際上包含某些內容。

+0

我可以使用'qobject_cast'嗎?而且,我可以使用typedef,比如'QCExpressionNode_ptr'作爲'QPointer '嗎? – 2011-04-14 02:04:30

+1

@Nathan Moos文檔qobject_cast說:「qobject_cast()函數的行爲與標準C++ dynamic_cast()」類似,所以我認爲應該可以。我也嘗試添加typedef QPointer Parentptr;並使用它而不是每次都聲明它,並且它工作。所以,你也可以這樣做。 – Liz 2011-04-14 15:56:50

+0

謝謝!這完全回答了我的問題。 – 2011-04-16 00:00:57