我认为这个问题没有任何好的解决方案,除了开始重构你的代码,以便任何给定的对象要么通过 QObject 样式的父/子关系管理,要么通过shared_ptr <> 引用计数——但永远不会同时在同一个对象。这两种方法彼此差异太大,难以调和。
也就是说,您可以做的一件事是为了在不进行太多重新设计的情况下完成上述操作:与其让 shared_ptr<> 指向您的 QObject,不如让 shared_ptr 指向一个(非基于 QObject ),shared_ptr 管理的QObject 子对象。
也就是说,而不是这样:
class MyQObject : public QObject
{
public:
MyQObject(int x, int y, int z, QObject * parent)
: QObject(parent), m_x, m_y, m_z {/* empty */}
int getX() const {return m_x;}
int getY() const {return m_y;}
int getZ() const {return m_z;}
private:
int m_x, m_y, m_z;
};
[...]
QObject * parent = new QObject;
shared_ptr<MyQObject> ptr(new MyQObject(1,2,3,parent)); // d'oh! trouble!
做这样的事情:
class MyData
{
public:
MyData(int x, int y, int z) : m_x(x), m_y(y), m_z(z)
int getX() const {return m_x;}
int getY() const {return m_y;}
int getZ() const {return m_z;}
private:
int m_x, m_y, m_z;
};
class MyQObject : public QObject
{
public:
MyQObject(int x, int y, int z, QObject * parent)
: QObject(parent), m_data(make_shared<MyData>(x,y,z)) {/* empty */}
int getX() const {return m_data->getX();}
int getY() const {return m_data->getY();}
int getZ() const {return m_data->getZ();}
shared_ptr<MyData> getData() {return m_data;}
private:
shared_ptr<MyData> m_data;
};
[...]
QObject * parent = new QObject;
QObject * myObj = new MyQObject(1,2,3,parent));
shared_ptr<MyData> ptr(myObj->getData()); // no problem!
这样,您的 Qt 样式代码可以访问 QObject 和 MyData,而 shared_ptr 样式代码可以访问 MyData。(当然,如果您的 shared_ptr 风格的代码还需要访问 QObject 本身,那么您可能不走运,因为 Qt 将决定何时何地删除 QObject 并且不会尊重 shared_ptr 语义)