Nun tauchen wir ab in die Tiefen des GObject-Systems: Wir implementieren die Funktionen, die beim Erstellen einer Instanz eines Objektes aufgerufen werden.
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_init | Hier wird die Klasse mit ihren Properties und internen Methoden (dispose/finalize) geformt. |
tutorial_tier_init | Hier können Member initialisiert werden. |
Diese beiden Methoden gilt es nun zu implementieren.
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.
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).
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!