It can be very handy to store things you might do as meta programming in your
GObjectClass‘s private data (See
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
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
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.