Boost logo

Boost Users :

From: Hickman, Greg (greg.hickman_at_[hidden])
Date: 2002-11-27 11:03:23


From: Peter Dimov [mailto:pdimov_at_[hidden]]
> From: "Hickman, Greg" <greg.hickman_at_[hidden]>
> > > From: Peter Dimov [mailto:pdimov_at_[hidden]]
> > > If 'f' is virtual, have the object store a weak_ptr to itself:
> > >
> > > class X
> > > {
> > > private:
> > >
> > > weak_ptr<X> weak_this;
> > >
> > > X();
> > > X(X const &);
> > > X& operator=(X const &);
> > >
> > > public:
> > >
> > > static shared_ptr<X> create()
> > > {
> > > shared_ptr<X> px(new X);
> > > px->weak_this = px;
> > > return px;
> > > }
> >
> > I must be missing something here, because it appears as though you
> > can't derive a Y from X and still initialize X::weak_this.
>
> You could simply make X::weak_this and X::X() protected...
> although if you follow the design rule that says that
> non-leaf classes should be abstract (and if possible contain
> no data) this shouldn't be necessary, as X as pictured above
> would be a leaf.

Its seems the leaf itself must implement the factory method/weak_this idiom.
This initially didn't seem like a good idea in our case since clients write
the leaves - we only provide X. But on second thought, perhaps two
alternatives are (1) provide a helper template for clients to use when
deriving from X to automatically declare the static create()/weak_this pair,
or (2) use an intrusive reference counting approach for X.

If an intrusive approach ultimately works better for us, what should I do as
a boost 1.29.0 user: use counted_base/shared_from_this, or intrusive_ptr
(which I admittedly haven't even looked at)?

Any suggestions you have are more than welcome.

-Greg


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