$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Yaoltzin Gomez (yaoltzin_at_[hidden])
Date: 2007-05-26 13:07:56
Thank you for you time to answer. Allthough your answer has helped me, I
still have the bad_weak_ptr exception. Every time I try to access the
shared_from_this pointer from inside Base member functions, I get that
exception. What I want to know is how can I access safely an without errors,
the shared_from_this pointer inside my Base class, when I create a smart
pointer instance of my Derived class.
In derived I don't have that problem  (I can access shared_from_this)
because this is the class the instance is created.
Thanks in advance
Peter Dimov wrote:
> Yaoltzin Gomez wrote:
>
> > Basically, what I have is this:
> >
> > class Base : public boost::enable_shared_from_this<Base>
> > {
> >    boost::shared_ptr<Base> GetBasePointer()
> >    {
> >       return shared_from_this();
> >    }
> >
> >    void Foo()
> >    {
> >       shared_ptr<Child> child( new Child );
> >       AddChild( child, GetBasePointer() );
> >    }
> > };
> >
> > class Derived: public Base, public
> > boost::enable_shared_from_this<Derived> {
> >    boost::shared_ptr<Derived> GetDerivedPointer()
> >    {
> >       return shared_from_this();
> >    }
>
> [...]
>
> One way to avoid putting more than one enable_shared_from_this<> base into
> Derived is to use
>
> class Derived: public Base
> {
>     boost::shared_ptr<Derived> GetDerivedPointer()
>     {
>        return dynamic_pointer_cast<Derived>( shared_from_this() );
>     }
>
>     // ...
> };
>
> static_pointer_cast will also work in this case (it will fail if Derived
> uses virtual inheritance).
>