It can be very handy to store things you might do as meta programming in your GObjectClass
‘s private data (See G_TYPE_CLASS_GET_PRIVATE()
).
Doing so is perfectly fine, but you need to be aware of how GTypeInstance
initialization works. Each of your parent classes instance init functions are called before your subclasses instance init (and in order of the type hierarchy). What might seem non-obvious though is that the GTypeInstance.g_class
pointer is updated as each successive _init()
function is called.
That means if you have my_widget_init()
and your parent class is GtkWidget
, the gtk_widget_init()
does not know it’s instantiating a subclass. Further more, GTK_WIDGET_GET_CLASS()
called from gtk_widget_init()
will get you the base classes GtkWidgetClass
, not the subclasses GtkWidgetClass
.
There are ways around this if you don’t use G_DEFINE_TYPE()
, but honestly, who wants to do that.
One technique around this, which I used in Bonsai’s DAO, is to use a single-linked list where the head is in each subclass, but the tail exists in each of the parent classes. That way you share all the parent structures, but the subclasses can access all of theirs. You’ll still want to defer most setup work until constructed()
though so you can get the full class information of the subclass and hierarchy.