[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: Chaining of dispose and finalize
- From: "Brian J. Tarricone" <bjt23 cornell edu>
- To: gtk-app-devel-list gnome org
- Subject: Re: Chaining of dispose and finalize
- Date: Fri, 3 Sep 2004 13:06:06 -0700
On 09/04/04 00:39, Russell Shaw wrote:
> Tristan Van Berkom wrote:
> >Russell Shaw wrote:
> >[...]
> >
> >>But how do i do that when g_object_real_dispose() and g_object_finalize()
> >>are both declared static in gobject.c ?
> >
> >
> >the gobject code always keeps a version of the class intact
> >(for quick reference at instantiation and for chaining):
> >
> >parent_class =
> > GTKTT_ANIM_CLASS (g_type_class_peek_parent
> > (musical_class));
> >
> >Usualy people keep a global like this assigned at class_init time
> >in order to avoid multiple calls.
>
> Hi,
> I understand that, and is what i do. What i mean is that most
> objects do in class_init something like:
>
> gobject_class->dispose=myobject_dispose;
>
> But this makes the original dispose code in gobject
> inaccessible. Same for gobject_class->dispose=myobject_finalize.
>
> Obviously something very basic i'm missing here;)
>
>
> Maybe i should record the parent functions in static pointers
> before overiding them:
>
>
> static gpointer parentdispose;
> static gpointer parentfinalize;
>
> myobject_class_init(MyObjectClass *klass){
> ...
> parentdispose=G_OBJECT_CLASS(parent_class)->dispose;
> parentfinalize=G_OBJECT_CLASS(parent_class)->finalize;
>
> G_OBJECT_CLASS(parent_class)->dispose=myobject_dispose;
> G_OBJECT_CLASS(parent_class)->finalize=myobject_finalize;
> ...
> }
this is incorrect. you want something like this:
...
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
gobject_class->dispose = myobject_dispose;
gobject_class->finalize = myobject_finalize;
parent_class = g_type_class_peek_parent(klass);
...
what you are trying to do is _overwrite_ the parent class' dispose and
finalized methods. what you want to do is _override_ them, by setting
the dispose and finalize methods in _your_ class as in my example above.
then, in myobject_dispose(), you do your dispose-related stuff, and then you
chain to the parent's dispose by doing:
G_OBJECT_CLASS(parent_class)->dispose(object);
at the bottom of your dipose function. then you need to do something similar in
myobject_finalize(). it seems the point you're not getting is that, in
your class_init() function, gobject_class is just a casted version of klass.
it is _not_ the same as the parent_class pointer that you set up with
g_type_class_peek_parent(). setting the ->dipose and ->finalize pointers
in your gobject_class does not affect those same pointers in parent_class.
if you're still not getting it, i'd suggest you look at the gtk source code.
pick a widget, and look for the _class_init() function, as well as any
_dispose() or _finalize() functions, and you'll see how it's done.
-brian
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]