|
Boost Users : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2007-04-12 12:49:16
Loïc Joly wrote:
> Hello,
>
> I have the following classes:
>
> class Owned;
> class Owner
> {
> unknownType getOwned(int i);
> vector<Owned> owned;
> };
>
> Owner will be handled in the client code by shared_ptr. At some
> places, the client code will only know one owned object, obtained
> through getOwned, therefore, the owned object should contain a
> shared_ptr to its owner, to make it survive. Now, my question is:
> What should be unknownType?
>
> If I make unknownType a classic shared_ptr<Owned>, I have a circular
> reference. What I would like would be a way to have a kind of
> shared_ptr<Owned> that would use the ref count of the owner. Is this
> possible to do?
If you are using a Boost release, you can do:
shared_ptr<Owned> getOwned( shared_ptr<Owner> p, int i )
{
return shared_ptr<Owned>( &p->owned[ i ], boost::bind(
&shared_ptr<Owner>::reset, p ) );
}
which is essentially your:
> - Make unknownType a class that contain a shared_ptr<Owner> and a
> Owned*, and forward all its functions to Owned.
Of course you need to keep the vector<> from reallocating since your pointer
will dangle.
If you are using the very latest CVS version that includes explicit support
for shared_ptr aliasing, it's even easier:
shared_ptr<Owned> getOwned( shared_ptr<Owner> p, int i )
{
return shared_ptr<Owned>( p, &p->owned[ i ] );
}
PS:
I can't resist the opportunity to correct the spelling of that function:
shared_ptr<Pwnt> getPwnt( shared_ptr<Pwn3rer> p, int i );
:-)
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