Boost logo

Boost Users :

From: Jean-François Brouillet (verec_at_[hidden])
Date: 2005-05-14 17:06:25


Thanks Stefan & Peter, for your replies.

I tried immediately:

struct MyTaskStruct : public LongTaskStruct
                         , TaskDoneStruct
                         ,
boost::enable_shared_from_this<MyTaskStruct> {

     MyTaskStruct() {
         setCallback(shared_from_this()) ;
     }

     ...
}

And obviously, I got:

terminate called after throwing an instance of 'boost::bad_weak_ptr'
   what(): boost::bad_weak_ptr

precisely because:

> but you can't do this in a constructor, because the outer shared_ptr<>
> hasn't been created yet.

But the next solution

> Use a static create() function as explained here :

is not good enough. I've got 150+ Java classes to translate, each with
an average of about 2 constructors. That would mean an extra 300
createXYZ, and apart from being ugly, and an insult to the user, is
a maintenance nightmare.

Ideally, I would want an intrusive_ptr (because no matter how they are
created, they can be made to share a single ref-count per body/
instance),
but one that offers the shared_ptr guarantee:

     shared_ptr<T> can be implicitly converted to shared_ptr<U> whenever
     T* can be implicitly converted to U*. In particular, shared_ptr<T>
     is implicitly convertible to shared_ptr<T const>, to shared_ptr<U>
     where U is an accessible base of T, and to shared_ptr<void>.

What I am after, is a construct as transparent as possible, for which
I can say, in my documentation, "For every struct XXX -- the body --,
there is a corresponding envelope -- xxxx_ptr<XXX> -- that walks and
talks like a XXX *"

So far, shared_ptr had everything covered except that "sharing" thing,
which is an artefact, not a requirement. intrusive_ptr makes this
"sharing" thingie a non issue (as it should be), but fails on the
"polymorphic covariance" quoted above...

In this project, it is acceptable to rely on a common base class,
(anyway I've got to translate Java's "Object" class :-) so I can
stuff it with whatever machinery is required to make garbage
collection work.

Any idea?

Many thanks.

--
JFB

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