Qt中如何为parent声明child是共享指针
How to declare for the parent that the child is a shared pointer in Qt
我有一个 class 声明如下:
class GuiImpl : public Gui
, protected QScrollArea
{
public:
typedef QScrollArea Base;
public:
GuiImpl (QWidget *parent)
: Base(parent)
, view(0)
{
}
~GuiImpl () { }
此 class 是 QScrollArea
的子项,该对象将被父项删除。问题是我将对象存储在 std::shared_ptr
中,所以当父级删除对象时,计数器不会减少并且共享指针之后会再次尝试删除对象,这会导致我的错误代码。
有没有办法将子对象声明为父对象的 shared_ptr
,以便父对象在引用计数器为零时删除对象?
您可以在父级的析构函数中分离子级:
class Parent
{
// ... Any your code
QSharedPointer< QObject > child;
~Parent()
{
child->setParent(nullptr);
}
};
但这很丑陋。相反,您不应该使用共享指针,正如@molbbdilo 在评论中所写的那样。如果你不喜欢原始指针,你可以使用 QPointer
包装器。
我有一个 class 声明如下:
class GuiImpl : public Gui
, protected QScrollArea
{
public:
typedef QScrollArea Base;
public:
GuiImpl (QWidget *parent)
: Base(parent)
, view(0)
{
}
~GuiImpl () { }
此 class 是 QScrollArea
的子项,该对象将被父项删除。问题是我将对象存储在 std::shared_ptr
中,所以当父级删除对象时,计数器不会减少并且共享指针之后会再次尝试删除对象,这会导致我的错误代码。
有没有办法将子对象声明为父对象的 shared_ptr
,以便父对象在引用计数器为零时删除对象?
您可以在父级的析构函数中分离子级:
class Parent
{
// ... Any your code
QSharedPointer< QObject > child;
~Parent()
{
child->setParent(nullptr);
}
};
但这很丑陋。相反,您不应该使用共享指针,正如@molbbdilo 在评论中所写的那样。如果你不喜欢原始指针,你可以使用 QPointer
包装器。