#include #include "boost/shared_ptr.hpp" #include "boost/weak_ptr.hpp" class A; class B; typedef boost::shared_ptr AStrongPtr; typedef boost::weak_ptr AWeakPtr; typedef boost::shared_ptr BStrongPtr; typedef boost::weak_ptr BWeakPtr; class A { public: A() { std::cout << "Ctor A<"<" << std::endl;} virtual ~A() { std::cout << "Dtor A<"<" << std::endl;} A(const A& aA) : b(aA.b) {std::cout << "CCtor A<"<" << std::endl;} A& operator=(const A& aA) { std::cout << "opr= A<"<" << std::endl; if(&aA != this){ b = aA.b; } return *this; } void setB(const BStrongPtr& aB) {b = aB;} // BWeakPtr& getB() { // std::cout << "Use non-const getB" << std::endl; // return b; // } const BWeakPtr& getB() const { std::cout << "Use const getB" << std::endl; return b; } private: BWeakPtr b; }; class B { public: B() { std::cout << "Ctor B<"<" << std::endl;} virtual ~B() { std::cout << "Dtor B<"<" << std::endl;} B(const B& aB) : a(aB.a) {std::cout << "CCtor B<"<" << std::endl;} B& operator=(const B& aB) { std::cout << "opr= B<"<" << std::endl; if(&aB != this){ a = aB.a; } return *this; } void setA(const AStrongPtr& aA) {a = aA;} AWeakPtr& getA() { std::cout << "Use non-const getA" << std::endl; return a; } const AWeakPtr& getA() const { std::cout << "Use const getA" << std::endl; return a; } private: AWeakPtr a; }; int main() { std::cout << "Create A & B" << std::endl; AStrongPtr aA(new A); BStrongPtr aB(new B); std::cout << "Make the association A <-> B" << std::endl; aA->setB(aB); aB->setA(aA); if(BStrongPtr aB = aA->getB().lock()) { std::cout << "Use a B given by A->getB().lock() " << std::endl; } std::cout << "return" << std::endl; return 0; }