Boost logo

Boost Users :

From: Martin Ecker (martin.ecker_at_[hidden])
Date: 2003-08-22 11:57:04


Hello,

I've been thinking of switching one of my projects to
use boost::smart_ptr and I'm currently investigating
this option a bit.

In my project there are a lot of cases where an object
acts as factory/parent object to create other child
objects.
These child objects must keep the parent object
alive as long as one of them still exists. Or in other
words, even if the client does not hold a pointer to
the parent object anymore, the parent must continue
to exist as long as there is still a child object.
Also the child objects sometimes need to have
access to the parent object that created them.
Therefore, I thought I'd have them hold a shared_ptr
to the parent object.

So the situation looks something like this, where
both Parent and Child objects are only allocated on the
heap and should only be passed around as shared_ptr.

class Parent
{
public:
    boost::shared_ptr<Child> CreateChild() const
    {
        boost::shared_ptr<Child> child(new Child(this));
        return child;
    }
};

class Child
{
    friend class Parent;

protected:
    Child(const boost::shared_ptr<Parent> parent)
        : m_parent(parent)
    {}

private:
    boost::shared_ptr<Parent> m_parent;
};

As far as I understand it I can't do new Child(this) because
Child expects a shared_ptr, so I'd have to derive Parent from
enable_shared_from_this.
However, in my project there are a number of classes in a rather
complicated class hierarchy to which the above pattern applies
and I'd thus like to avoid having to (multiply) derive them from
enable_shared_from_this.
Is there another, possibly better way of achieving what I
want to do (keep the parent alive as long as there are still
child objects) that I haven't discovered yet? Or do I really
have to derive all these classes from enable_shared_from_this?
Do I have to derive each class in a class hierarchy from
enable_shared_from_this, if each of them needs to give
out a shared_ptr-managed this pointer?

Thanks for any help,
Martin


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net