我有一个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
的新手,我想知道是否有遗漏的东西,或者原因是什么?
答案 0 :(得分:3)
根据官方文件:
允许为已由共享指针管理的对象获取QSharedPointer的基类。当您需要从类的任何实例创建QSharedPointer时,可以继承此类;例如,来自对象本身。
所以你需要将你的指针实例化为智能指针:
QSharedPointer<MyClass> mc(new MyClass());
mc->testSharedThis();
或者在您的情况下使用与Qt智能指针相同的std :: make_shared:
QSharedPointer<MyClass> mc = QSharedPointer<MyClass>::create();
mc->testSharedThis();