Boost logo

Boost Users :

Subject: Re: [Boost-users] shared_from_this - derived classes (yes, I googled)
From: Christopher Pisz (cpisz_at_[hidden])
Date: 2011-10-01 15:51:33


Igor R <boost.lists <at> gmail.com> writes:

>
> > I inherited from enable_shared_from_this in my base class.
> > When I called shared_from_this() in my derived class it throws an exception.
> > When I go up the call stack I see that in the boost implementation weak_ptr
is
> > NULL and count is NULL.
> >
> > I ensured the derived class was instatiated as a shared_ptr by using a
fatory method.
>
> If you create shared_ptr, as you described, and then call
> shared_from_this(), it should not throw exceptions. If it does, can
> you provide a trivial reproducing sample?
>

Well, I tried to get a trivial example and ended up having a working example. I
suppose my problem is in the non-trivial part of my code :)

Is this the correct way to do it?

#include <iostream>

#include <boost/enable_shared_from_this.hpp>
#include <boost/shared_ptr.hpp>

//--------------------------
class A : public boost::enable_shared_from_this<A>
{
public:

    ///
    typedef boost::shared_ptr<A> SmartPtr;

    ///
    static A::SmartPtr Create()
    {
        A::SmartPtr instance;

        // Check arguments if any

        // Create an instance of this class
        instance.reset(new A());

        return instance;
    }

    virtual ~A()
    {
    }

protected:

    A()
    {
    }

};

//--------------------------
class B : public A
{
public:

    ///
    typedef boost::shared_ptr<B> SmartPtr;

    ///
    static B::SmartPtr Create()
    {
        B::SmartPtr instance;

        // Check arguments if any

        // Create an instance of this class
        instance.reset(new B());

        return instance;
    }

    ///
    virtual ~B()
    {
    }

    ///
    B::SmartPtr Foo()
    {
        A::SmartPtr temp = shared_from_this();
        B::SmartPtr me = boost::shared_dynamic_cast<B, A>(temp);

        return me;
    }

    ///
    void Bar() const
    {
        std::cout << "Success!" << std::endl;
    }

protected:

    ///
    B()
        :
        A()
    {
    }
};

//--------------------------
int main()
{
    B::SmartPtr b1 = B::Create();
    B::SmartPtr b2 = b1->Foo();

    if( b1 != b2 )
    {
        std::cout << "they aren't equal." << std::endl;
        return 1;
    }

    b2->Bar();

    return 0;
}


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