【问题标题】:How do I construct an object that holds a reference to a parent using a weak_ptr?如何使用weak_ptr 构造一个包含对父对象的引用的对象?
【发布时间】:2012-02-11 13:31:47
【问题描述】:

假设我有一个包含指向子对象的 shared_ptr 的对象。

我希望子对象对父对象有一个weak_ptr,子对象的构造函数应该是什么样的,我应该如何从父对象构造一个子对象?

提前致谢

【问题讨论】:

  • “父”与哪些其他对象共享“子”的所有权? “孩子”是否有多个父母?
  • 孩子总是有一个父母,孩子不共享
  • 在这种情况下,孩子可以持有指向其父母的原始指针,因为保证孩子不会比其父母长寿。您是否无权访问unique_ptr
  • 有道理,不需要智能指针谢谢!
  • @peachykeen:原始指针更简单。为什么在不需要的时候要使用智能指针?

标签: c++ constructor weak-ptr


【解决方案1】:

由于您拥有子对象的唯一所有权,因此可以保证子对象的寿命不会超过其父对象。你可以有一个像这样的模型。

struct Parent;

struct Child {
        Child( Parent& p ) : p_(&p) {}
        Parent* p_;
};

#include <memory>

struct Parent {
        std::unique_ptr<Child> c_;
        void AddChild() {
                c_.reset(new Child(*this));
        }
};

当然,子级在析构函数中对父级所做的任何事情都应该小心,它可能会因为父级超出范围而被销毁。这是一个孩子拥有weak_ptr 到其父母的唯一优势(它仍然无法通过其析构函数对父母做任何事情,但至少它可以安全地告诉这一点)但这取决于它的父母是由shared_ptr 拥有,这对孩子来说是一个更加不灵活的设计。

这将是weak_ptr 解决方案:

// NOT RECOMMENDED
#include <memory>

struct Parent;

struct Child {
        Child( const std::shared_ptr<Parent>& p ) : p_(p) {}
        std::weak_ptr<Parent> p_;
};

struct Parent : std::enable_shared_from_this<Parent> {
        std::unique_ptr<Child> c_;
        void AddChild() {
                // Warning, undefined behaviour if this Parent
                // isn't owner by shared_ptr
                c_.reset(new Child(shared_from_this()));
        }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多