Seitenleiste

Objektinitialisierung

Nun tauchen wir ab in die Tiefen des GObject-Systems: Wir implementieren die Funktionen, die beim Erstellen einer Instanz eines Objektes aufgerufen werden.

Die Theorie

Natürlich stellt sich die Frage, was alles initialisiert werden muss. Grundsätzlich wird ein GObject immer mit der Funktion g_object_new erstellt.

gpointer g_object_new (GType object_type, const gchar *first_property_name, ...);

Allerdings verlangt diese Funktion im GObject, dessen GType 1) übergeben wurde, zwei Erstellungsfunktionen:

tutorial_tier_class_initHier wird die Klasse mit ihren Properties und internen Methoden (dispose/finalize) geformt.
tutorial_tier_initHier können Member initialisiert werden.

Diese beiden Methoden gilt es nun zu implementieren.

Die Klasse initialisieren

Folgender Code:

tutorial-tier.c
static void
tutorial_tier_class_init(TutorialTierClass *klass)
{
    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
 
    g_type_class_add_private(klass, sizeof(TutorialTierPrivate));
}

Wie bereits erwähnt, initialisieren wir hier Klasseneigenschaften. Momentan besitzt unsere Klasse nur ein privates Feld als „besondere“ Eigenschaft.

Die Member initialisieren

Auch dies ist schnell erledigt:

tutorial-tier.c
static void
tutorial_tier_init(TutorialTier *self)
{
    self->priv = TUTORIAL_TIER_GET_PRIVATE(self);
 
    self->priv->ruf = g_malloc(10);
}

Nun lässt sich die Funktion des Makros erkennen: Es liefert einen Pointer auf die private Struktur, die klassenintern gehalten wird (da sie in tutorial_tier_class_init als Klasseneigenschaft initialisiert wurde).

g_object_new

Sind diese beiden Methoden erst einmal erstellt, lässt sich unser neues GObject schon erstellen:

gpointer g_object_new(GType object_type, const gchar *first_property_name, ...);

Momentan haben wir noch keine Properties definiert, also ist der Aufruf für unser „Tier“ sehr einfach:

TutorialTier *instance = g_object_new(TUTORIAL_TYPE_TIER, NULL);

Hinweis: Um Speicherlecks zu vermeiden, bitte erst die nächste Lektion lesen, bevor ihr das nun bisher gelernte anwendet!

1)
Den GType unseres Objektes erlangt man durch das Makro TUTORIAL_TYPE_TIER