I am currently trying to learn how to use smart pointers. However while doing some experiments I discovered the following situation for which I could not find a satifying solution:
Imagine you have an object of class A being parent of an object of class B (the child), but both should know each other:
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;
};
The question is how can an object of class A pass a std::shared_ptr of itself (this) to its child?
There are solutions for Boost shared pointers (Getting a boost::shared_ptr for this), but how to handle this using the std:: smart pointers?
There is
std::enable_shared_from_thisjust for this purpose. You inherit from it and you can call.shared_from_this()from inside the class. Also, you are creating circular dependencies here that can lead to resource leaks. That can be resolved with the use ofstd::weak_ptr. So your code might look like this (assuming children rely on existence of parent and not the other way around):Note however, that calling
.shared_from_this()requires thatthisis owned bystd::shared_ptrat the point of call. This means that you cannot create such object on stack anymore, and generally cannot call.shared_from_this()from within a constructor or destructor.