====== 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 ((Den GType unseres Objektes erlangt man durch das Makro TUTORIAL_TYPE_TIER)) ü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.
===== 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!
====== ======