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