
Michael Anderson wrote: [snip]
For example I want this to work... where ptr<Bar> is some kind of smart (or otherwise) pointer to a bar object.
{ ptr<Bar> barPtr; { ptr<Foo> fooPtr(new Foo); barPtr = fooPtr->bar; //A } barPtr->doSomething(); //B //C }
Something similar is possible if Bar is polymorphic, see below. I'm leaving out includes and the "boost::" namespace references, but it should give you the basic idea: --- Bar.h --- struct Bar { virtual void Baz() = 0; }; --- Foo.h --- struct Foo : enable_shared_from_this<Foo> { Foo(); shared_ptr<Bar> GetBar(); private: shared_ptr<Bar> pBar_; }; ---- Foo.cpp ---- namespace { struct BarImpl : Bar { void Baz() { } }; struct BarDelegatorWithFooRef : Bar { BarDelegatorWithFooRef(shared_ptr<Foo> pFoo, shared_ptr<Bar> pBar) : pFoo_(pFoo) , pBar_(pBar) {} void Baz() { pBar_->Baz(); } private: shared_ptr<Foo> pFoo_; shared_ptr<Bar> pBar_; }; } // anonymous namespace Foo::Foo() : pBar_(new BarImpl) {} shared_ptr<Bar> Foo::GetBar() { return shared_ptr<Bar>(new BarDelegatorWithFooRef(shared_from_this(), pBar_)); } --------------- The following should then work as you wished: { shared_ptr<Bar> barPtr; { shared_ptr<Foo> fooPtr(new Foo); barPtr = fooPtr->GetBar(); } barPtr->doSomething(); } Beware of typos! / Johan