QEnableSharedFromThis :: sharedFromThis()返回nullptr

时间:2017-12-10 01:21:18

标签: c++ qt qt5 qsharedpointer

我有一个class MyClass应该可以返回这个包裹在QSharedPointer<MyClass>中。

我的理解(和经验)只是简单地创建QSharedPointer<MyClass>(this)的新实例是不可取的。相反,实现我想要的正确方法是让MyClass继承QEnableSharedFromThis<MyClass>以提供成员函数sharedFromThis()

此成员函数应返回QSharedPointer<MyClass>中包含的,而不会产生所有可能发生的不良副作用。

class MyClass : public QEnableSharedFromThis<MyClass>
{
   /* ... */
   public:
      void testSharedThis()
      {
         auto sp=QEnableSharedFromThis<MyClass>::sharedFromThis();
         if(sp.isNull()){
            qWarning()<<"SHARED POINTER TO *this* WAS NULL!";
         }
      }
};

void main(){
   MyClass *mc=new MyClass;
   mc->testSharedThis();
}

但是,当我在上面的示例中运行testSharedThis()时,sharedFromThis()始终返回 nullptr ,而不是QSharedPointer<MyClass>中包含的

我是QEnableSharedFromThis的新手,我想知道是否有遗漏的东西,或者原因是什么?

1 个答案:

答案 0 :(得分:3)

根据官方文件:

  

允许为已由共享指针管理的对象获取QSharedPointer的基类。当您需要从类的任何实例创建QSharedPointer时,可以继承此类;例如,来自对象本身。

所以你需要将你的指针实例化为智能指针:

QSharedPointer<MyClass> mc(new MyClass());
mc->testSharedThis();

或者在您的情况下使用与Qt智能指针相同的std :: make_shared:

QSharedPointer<MyClass> mc = QSharedPointer<MyClass>::create();
mc->testSharedThis();