std :: shared_ptr这个
我目前正在学习如何使用智能指针。 然而,在做一些实验时,我发现了以下的情况,我找不到一个可喜的解决scheme:
假设你有一个A类的对象,它是B类对象(孩子)的父对象,但两者都应该相互认识:
class A; class B; class A { public: void addChild(std::shared_ptr<B> child) { children->push_back(child); // How to do pass the pointer correctly? // child->setParent(this); // wrong // ^^^^ } private: std::list<std::shared_ptr<B>> children; }; class B { public: setParent(std::shared_ptr<A> parent) { this->parent = parent; }; private: std::shared_ptr<A> parent; };
问题是一个类A的对象如何将一个std::shared_ptr
自身( this
)传递给它的subprocess呢?
有一些Boost共享指针的解决scheme( 获取一个boost::shared_ptr
this
),但如何处理这个使用std::
智能指针?
有std::enable_shared_from_this
只是为了这个目的。 你从它inheritance,你可以从类里面调用.shared_from_this()
。 你也在这里创build循环依赖,这可能导致资源泄漏。 这可以通过使用std::weak_ptr
来解决。 所以你的代码可能看起来像这样(假设孩子依靠父母的存在而不是其他方式):
class A; class B; class A : public std::enable_shared_from_this<A> { public: void addChild(std::shared_ptr<B> child) { children.push_back(child); // like this child->setParent(shared_from_this()); // ok // ^^^^^^^^^^^^^^^^^^ } private: // note weak_ptr std::list<std::weak_ptr<B>> children; // ^^^^^^^^ }; class B { public: void setParent(std::shared_ptr<A> parent) { this->parent = parent; } private: std::shared_ptr<A> parent; };
但是请注意,调用.shared_from_this()
需要在调用时由std::shared_ptr
拥有它。 这意味着你不能在堆栈上创build这样的对象,并且通常不能从构造函数或析构函数中调用.shared_from_this()
。
你在devise中有几个问题,这似乎源于你对智能指针的误解。
智能指针用于声明所有权。 通过宣称父母双方都拥有所有的孩子,而且每个孩子都拥有这个孩子的父母,这就是打破了这一点。 两者都不是真的。
另外,你在getChild()
中返回一个弱指针。 通过这样做,您声明呼叫者不应该关心所有权。 现在这可能是非常有限的,但也是这样做的,你必须确保有问题的孩子不会在任何弱指针被持有的情况下被破坏,如果你使用了一个智能指针,它会自行sorting。
而最后的事情。 通常,当你接受新的实体时,你通常应该接受原始的指针。 智能指针可以在父母之间交换孩子有其自己的意义,但是对于一般用法,您应该接受原始指针。