QPointer для абстрактного базового класса - PullRequest
0 голосов
/ 14 апреля 2011

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

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

1 Ответ

3 голосов
/ 14 апреля 2011

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

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

...