2014-11-21 15:02 GMT+01:00 Kjell Ahlstedt <kjell.ahlst...@bredband.net>:

>  Have you tried:
>
> Glib::RefPtr<Query> query = QueryAllocation::create();
> do_sth(query);
> Glib::RefPtr<QueryAllocation> alloc_query =
> Glib::RefPtr<QueryAllocation>::cast_dynamic(query);
>
> It's not very nice, but if it works, it's better than fiddling with
> unreference() and reference().
>
It doesn't really solve my problem, but it's still some kind of workaround
(probably better than my trick with inc/dec refcounts, but still -
workaround). When I'd like to call QueryAllocation's methods, I have to do
castings:

           Glib::RefPtr<QueryAllocation>::cast_static(query)->call1();
          Glib::RefPtr<QueryAllocation>::cast_static(query)->call2();
It's inconvenient.

> The obvious suggestion is to fix do_sth(). It's really odd to require
> refcount==1.
>
It's not odd in gstreamer. A lot of methods requires refcount equals 1,
because if refcount is greater, a copy of object is created (or even
assertion fails, in some cases). That's why I don't want to increase
refcount, if it's in fact not necessary. Of course, I can implement my
method as template function:

          template<typename T> void do_sth(const Glib::RefPtr<T>& arg);

and it's even type-safe, but I've got bad feelings about it. It's tricky,
type of argument isn't obvious, and a lot of code has to be moved to a
header files (or instantiate template by every possible query type in
source file, but it's inconvenient).

Best regards,
Marcin Kolny


> Kjell
>
> Den 2014-11-21 10:18, Marcin Kolny skrev:
>
> Hi,
> I've got following problem;
> I've got a class Query, which is base class for QueryAllocation. Passing \
> QueryAllocation object as Query to a function is pretty simple because of
> automatic cas\
> ting:
>
> void do_sth(const RefPtr<Query>& query);
> ...
> RefPtr<QueryAllocation> alloc_query = QueryAllocation::create ();
> do_sth (alloc_query);
>
> But... in do_sth method, refcount of my object equals 2 (because casting \
> increases ref count, it's obvious). Unfortunately, I have to have refcoun\
> t=1 in do_sth method, so that's what I'm doing now:
>
> RefPtr<QueryAllocation> alloc_query = QueryAllocation::create();
> RefPtr<Query> query = alloc_query;
> query->unreference();
> do_sth(query);
> query->reference();
> query.reset();
>
> It's workaround.. that would be great, if I can do something like "unmana\
> ged RefPtr". It might look like this:
>
> RefPtr<QueryAllocation> alloc_query = QueryAllocation::create();
> do_sth(RefPtr<Query>(alloc_query, false));
>
> And constructor declaration:
> template<typename T>
> RefPtr(const RefPtr<T>& src, bool manage = true);
>
> If 'manage' equals false, RefPtr doesn't increase/decrease refcount durin\
> g construction and destruction. I know, it's unsafe, and might lead to a \
> problems, if somebody uses it wrong, but it allows me to remove a lot of \
> magic from my code.
>
> Of course, it's only conceptual solution, maybe it would be better to do \
> single function instead of constructor, ideas are welcome.
>
> Best regards,
> Marcin Kolny
>
>
>
_______________________________________________
gtkmm-list mailing list
gtkmm-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to