c++shared-ptrboost-smart-ptr

shared_ptr increase parent reference


pseudo code :

typedef shared_ptr<B> ptr_child;
typedef shared_ptr<A> ptr_parent ;
class A
{
public:
    A()
    {
        child = ptr_child(new B);
    }

    ptr_child getB()
    {
        return child;
    }
private:
    ptr_child child;
};

I want to use shared_ptr to manage pointer of A and B. B is A's child. And when have strong reference to child, parent A can't be destroyed.

Question is how to increase reference count of parent A when when B reference increased.


Solution

  • I have solved the problem, code as follow:

    #include <memory>
    
    class B;
    class A;
    
    typedef std::shared_ptr<A> a_ptr;
    typedef std::shared_ptr<B> b_ptr;
    class B
    {
    public:
        B(A* prt):parent(prt){}
    
    private:    
        A* parent;
    };
    
    class A : public std::enable_shared_from_this<A>
    {
    public:
        A(){}
        b_ptr getChild()
        {
            b_ptr pb = b_ptr(this->shared_from_this(), child);
            return pb;
        }
    
        static a_ptr getA()
        {
            a_ptr pa = a_ptr(new A);
            pa->child = new B(pa.get());
            return pa;
        }
    
    private:
        B* child;
    };
    
    int wmain(int argc, wchar_t* argv[])
    {
        a_ptr a = A::getA();
        printf("a ref %d\n", a.use_count());
        b_ptr b1 = a->getChild();
        printf("a ref %d, b1 ref %d, \n", a.use_count(), b1.use_count());
        b_ptr b2 = a->getChild();
        printf("a ref %d, b1 ref %d, \n", a.use_count(), b1.use_count());
        b_ptr b3 = b2;
        printf("a ref %d, b1 ref %d, \n", a.use_count(), b1.use_count());
    
        //A and B are share reference, when no reference to A, but have reference to B, A will not be destroyed.
    
        return 0;
    }
    

    output:

    a ref 1
    a ref 2, b1 ref 2,
    a ref 3, b1 ref 3,
    a ref 4, b1 ref 4,