[cairo] cairomm RefPtr
Larry Lewis
lewislp at yahoo.com
Mon Dec 3 08:07:34 PST 2007
--- Murray Cumming <murrayc at murrayc.com> wrote:
>
> On Sat, 2007-12-01 at 11:49 -0800, Larry Lewis wrote:
> > --- Bertram Felgenhauer <bertram.felgenhauer at googlemail.com> wrote:
> >
> > > Larry Lewis wrote:
> > > > Is there a specific reason why cairomm's RefPtr implementation
> > > (along
> > > > with glibmm) does not provide the T_CppObject& operator*() and
> > > > T_CppObject* get() methods? Both reference-counting pointer
> > > > implementations I use on a regular basis (boost::shared_ptr and
> > > > Poco::SharedPtr) provide this functionality, which is extremely
> > > > useful for passing the object by reference or directly
> accessing
> > > > the raw pointer. It's unfortunate to have to resort to the
> ugly
> > > > operator->() syntax to access the pointer.
> > >
> > > Woops sorry, I misread that, apparently you want the C++ object,
> not
> > > the C one. But why would you need the pointer to the C++ object?
> It
> > > only contains is a pointer.
> > >
> > > RefPtr is really designed to be used with wrapper objects like
> these,
> > > not for arbitrary C++ objects.
> > >
> >
> > I agree that they're not intended for use as general-purpose
> > reference-counting pointers. It would be nice, however, to allow
> > developers to write API that accepts types such as Cairo::Surface
> and
> > Cairo::Context by reference.
>
> Glib::RefPtr<> and Cairo::RefPtr<> don't make it easy to get a bare
> pointer because you might then use it. Then you'd be likely to end up
> with a pointer to an object that has been deleted because it's been
> completely unreferenced. This would be likely in the situation you
> describe.
>
> People would then sometimes do manual reference counting to solve the
> problems that they discover, compounding the problem. RefPtr makes
> life
> easy precisely because you should _never_ need to worry about
> reference
> counting.
>
> Even if you were very careful, the existence of operator* would
> encourage people to think that they should use it. This is a strategy
> that has worked well so far.
>
I understand this may cause unintended behavior if you don't really
understand the shared pointer concept. I will accept passing const
RefPtr references around for the sake of the uninformed programmer.
> > Using const Cairo::RefPtr<Cairo::Context>
>
> Only of the pointer, though you should use const & to avoid that.
>
> > causes a copy while const Cairo::RefPtr<Cairo::Context>& adds
> another
> > layer of indirection.
>
> I'm not sure what you mean by layer of indirection. No copying or
> calling happens when passing a const &.
What's really going on here is passing a pointer (the reference) to a
pointer (the pointer within RefPtr).
>
> > Both force the function writer to perform a NULL
> > check, which is contrary to my (and others' I suppose) convention
> of
> > passing by reference to enforce non-NULL parameters.
>
> That's nice sometimes, yes, but it's not the end of the world if you
> can't do it.
>
> > To get a simple
> > reference, syntax such as *context.operator->() is required.
>
> --
> murrayc at murrayc.com
> www.murrayc.com
> www.openismus.com
>
>
Thanks for the replies. I'll defer this discussion until TR1 is
approved and the C++ library gets a proper shared pointer
implementation.
Larry
More information about the cairo
mailing list