用于抽象基类的QPointer



我正在编写一个表达式解析库。它是用Qt编写的,我有这样的类结构:
QCExpressionNode-表达式所有部分的抽象基类
QCConstantNode-表达式中的常量(扩展QCExpressionNode(
QCVariableNode-表达式中的变量(扩展QCExpressionNode(
QCBinaryOperatorNode-二进制加法、减法、乘法、除法和幂运算符(扩展QCExpressionNode(

我希望能够使用智能指针(如QPointerQSharedPointer(,但我遇到了以下挑战:
-QPointer可以与抽象类一起使用吗?如果是,请举例说明
-如何将QPointer强制转换为具体的子类?

我看不出你为什么不能这样做。举个例子:

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实际上包含一些内容。

相关内容

  • 没有找到相关文章

最新更新