如何为父母声明孩子是Qt中的共享指针

Posted

技术标签:

【中文标题】如何为父母声明孩子是Qt中的共享指针【英文标题】:How to declare for the parent that the child is a shared pointer in Qt 【发布时间】:2015-04-09 11:35:45 【问题描述】:

我有一个类声明如下:

class GuiImpl : public Gui
              , protected QScrollArea

public:
    typedef QScrollArea Base;

public:
    GuiImpl (QWidget *parent)
    : Base(parent)
    , view(0)
    
    

    ~GuiImpl ()   

该类是QScrollArea 的子类,该对象将被父类删除。问题是我将对象存储在std::shared_ptr 中,所以当父级删除对象时,计数器不会减少,共享指针会在之后再次尝试删除对象,这会导致我的代码出现错误。

有没有办法将子代声明为父代的shared_ptr,这样父代就在引用计数器为零时删除对象?

【问题讨论】:

为什么将它存储在shared_ptr 中?父级对其拥有独占所有权。 是的,你是对的。我没有找到任何其他方法来解决它。 【参考方案1】:

您可以在父级的析构函数中分离子级:

class Parent

  // ... Any your code
  QSharedPointer< QObject > child;

  ~Parent()
  
    child->setParent(nullptr);
  
;

但这很丑。相反,您不应该使用共享指针,正如@molbbdilo 在评论中所写。如果您不喜欢原始指针,可以使用 QPointer 包装器。

【讨论】:

以上是关于如何为父母声明孩子是Qt中的共享指针的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 如何为关系设置值?

如何选择名字等于孩子名字的父母

Qt:获取父母区域内的所有孩子

如何在可扩展的listview android中将孩子添加到特定的父母

Python:在分叉的孩子和父母之间共享变量

当父母和孩子都写入标准输出时,输出中没有交错