====== 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! ====== ======
**[[gui:gtk:gobject:implementation|zurück]] || [[gui:gtk:start|hoch zur Startseite]] || [[ gui:gtk:gobject:destruction|weiter]]**