1

式解析ライブラリを作成しています。これは Qt で書かれており、私は次のようなクラス構造を持っています:
QCExpressionNode-式のすべての部分の抽象基底クラス -式の
QCConstantNode定数 (extends QCExpressionNode)
QCVariableNode-式の変数 (extends QCExpressionNode)
QCBinaryOperatorNode-2 進数の加算、減算、乗算、除算および電力事業者 (延長QCExpressionNode)

QPointerスマート ポインター (や など)を使用できるようにしたいのQSharedPointerですが、次の課題に直面しています。 - 抽象クラスで使用
できますか? QPointerもしそうなら、例を挙げてください。-具体的なサブクラス
にキャストする方法は?QPointer

4

1 に答える 1

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() もチェックする必要があります。

于 2011-04-14T01:49:32.917 に答える