QPointer для абстрактного базового класса

Я пишу библиотеку для анализа выражений. Он написан с использованием Qt, и у меня есть такая структура классов:
QCExpressionNodeАбстрактный базовый класс для всех частей выражения
QCConstantNodeКонстанты в выражении (расширяет QCExpressionNode)
QCVariableNodeПеременные в выражении (расширяет QCExpressionNode)
QCBinaryOperatorNode-Бинарные операторы сложения, вычитания, умножения, деления и мощности (расширяет QCExpressionNode)

Я хотел бы иметь возможность использовать умные указатели (как QPointer или же QSharedPointer), но я сталкиваюсь со следующими проблемами:
-Может QPointer использоваться с абстрактными классами? Если да, приведите примеры.
-Как бросить QPointer к конкретному подклассу?

1 ответ

Решение

Я не вижу причин, почему вы не можете сделать это. Возьмите этот пример:

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 действительно содержит что-то.

Другие вопросы по тегам