0

我有一个class MyClass应该能够返回这个包裹在QSharedPointer<MyClass>.

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

这个成员函数应该返回this Wrapped inQSharedPointer<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,我想知道我是否缺少某些东西,或者可能是什么原因造成的?

4

1 回答 1

3

根据官方文档:

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

因此,您需要将指针实例化为智能指针:

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

或者在您的情况下,对 Qt 智能指针使用等效于 std::make_shared 的内容:

QSharedPointer<MyClass> mc = QSharedPointer<MyClass>::create();
mc->testSharedThis();
于 2017-12-10T01:57:06.677 回答