c++ - QEnableSharedFromThis::sharedFromThis() 返回 nullptr

标签 c++ qt qt5 qsharedpointer

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

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

这个成员函数应该返回包裹在QSharedPointer<MyClass>中的this没有否则会发生的所有不良副作用。

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> 中的 this .

我是 QEnableSharedFromThis 的新手我想知道我是否遗漏了什么,或者这可能是什么原因造成的?

最佳答案

根据官方文档:

A base class that allows obtaining a QSharedPointer for an object already managed by a shared pointer. You can inherit this class when you need to create a QSharedPointer from any instance of a class; for instance, from within the object itself.

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

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

或者在您的情况下,对 Qt 智能指针使用与 std::make_shared 等效的方法:

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

关于c++ - QEnableSharedFromThis::sharedFromThis() 返回 nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47734973/

相关文章:

c++ - Emacs + C/C++ + Doxygen : Alternative to doxymacs? 使用 yasnippet?

c++ - QML:如何将动态创建的组件与自定义的内部对象一起使用?

c++ - 如何在 Qt 中使用 QDataStream 将自定义结构保存/加载到二进制文件中?

c++ - 在 Visual Studio 2015 中检测要与 C++ 宏一起使用的 SIMD 指令集

C++将 vector 的 vector 元素插入 vector

c++ - QFileSystemModel QTreeView 中某些项目(行)的背景颜色

c++ - 字符串列表和字符串

qt - Qmake项目依赖(链接库)

qt - 将 Qt3D 与 Qt5 一起使用

C++ map 插入和查找性能和存储开销