====== Introduzione alla Glib Object System ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//10/06/2012//** \\ \\ [[http://developer.gnome.org/gobject/stable/|Gobject]] è una libreria libera che permette di utilizzare la logica ad oggetti itramite il linguaggio C. Scritta grazie a [[http://developer.gnome.org/glib/stable/|Glib]] è una libreria altamente portabile con la quale sono stati scritti numerosi e famosi progetti come GTK+, GNOME, GIMP e tanti altri. \\ In questo articolo andremo a vedere come creare un oggetto con due soli metodi get e set (oltre al costruttore) per settare il valore di una proprieta', in questo caso un semplice valore intero. ===== Come si usera' il nostro oggetto ===== Come di consueto dobbiamo creare il nostro oggetto dichiarandone un'istanza e poi usare i metodi set e get per settare il contenuto della nostra proprieta'. Ecco come: \\ \\ **main.c** #include #include "pobobject.h" int main (int argc, char **argv) { //Inizializzo i tipi di glib g_type_init(); //Dichiaro un' istanza del mio oggetto "oggetto_qualsiasi" di tipo "pobobject" pobobject* oggetto_qualsiasi= pob_object_new(); //Setto il valore della proprieta' pubblica myval tramite il metodo "pob_object_set" pob_object_set(oggetto_qualsiasi, 35); //Prelevo il valore della proprieta' pubblica "myval" tramite il metodo "pob_object_get" printf("il valore di myval: %d\n",pob_object_get(oggetto_qualsiasi)); return 0; } Come possiamo vedere il nostro oggetto '' oggetto_qualunque'' è di tipo **pobobject** e i metodi che richiamiamo fanno parte del namespace **pob_** . \\ Passiamo adesso all'implementazione della classe gobject per il nostro oggetto pobobject. ===== La classe pobobject ===== La nostra classe è composta di 2 file **pobobject.h** con le consuete intestazioni e prototipi C e **pobobject.c** con le implementazioni dei metodi. \\ \\ **pobobject.h** #ifndef __POBOBJECT_H__ #define __POBOBJECT_H__ #include G_BEGIN_DECLS #define POB_TYPE_OBJECT (pob_object_get_type()) #define POB_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ POB_TYPE_OBJECT, pobobject)) #define POB_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ POB_TYPE_OBJECT, pobobjectClass)) #define POB_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ POB_TYPE_OBJECT)) #define POB_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ POB_TYPE_OBJECT)) #define POB_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),\ POB_TYPE_OBJECT, pobobjectClass)) typedef struct _pobobject pobobject; typedef struct _pobobjectClass pobobjectClass; typedef struct _pobobjectPrivate pobobjectPrivate; struct _pobobject { GObject parent; /* Qui si possono aggiungere le dichiarazioni pubbliche */ int myval ; pobobjectPrivate *priv; }; struct _pobobjectClass { GObjectClass parent_class; }; //Qui elenchiamo i prototipi dei metodi della classe contenuti in "pobobject.c" GType pob_object_get_type (void); GObject* pob_object_new (void); //costruttore int pob_object_get(pobobject* self); // metodo per prelevare myval void pob_object_set(pobobject* self, int i); // metodo per settare prelevare myval G_END_DECLS #endif /* __POBOBJECT_H__ */ Come possiamo notare sono molte le macro che si usano per generare un gobject, ma per fortuna esistono numerosi generatori di classi gobject. Io ho usato il plugin per la generazioni delle classi di [[http://www.geany.org/|Geany]]. In pratica i metodi che noi andremo a usare sono solo i seguenti: GObject* pob_object_new (void); //costruttore int pob_object_get(pobobject* self); // metodo per prelevare myval void pob_object_set(pobobject* self, int i); // metodo per settare prelevare myval tutto il resto tranne che le struct **_pobobject** e **_pobobjectPrivate** servono per l'implementazione dell'oggetto gobject. **pobobject.c** #include "pobobject.h" struct _pobobjectPrivate { /* Aggiungere qui le dichiarazioni private */ }; //Definisco tramite la macro G_DEFINE_TYPE il tipo "pobobject" G_DEFINE_TYPE(pobobject, pob_object, G_TYPE_OBJECT) //Funzione che inizializza l'instanza della classe static void pob_object_class_init(pobobjectClass *klass) { g_type_class_add_private((gpointer)klass, sizeof(pobobjectPrivate)); } //Funzione che inizializza la classe vera e propria static void pob_object_init(pobobject *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, POB_TYPE_OBJECT, pobobjectPrivate); } //Costruttore della classe GObject *pob_object_new(void) { return g_object_new(POB_TYPE_OBJECT, NULL); } /* *** Da qui in poi possiamo finalmente implementare i nostri metodi *** */ //Questo e' il metodo get e ci servira' per prelevare il valore della // variabile pubblica "myval" int pob_object_get(pobobject* self) { return self->myval; } void pob_object_set(pobobject* self, int i) { self->myval= i ; } ===== Il makefile ===== CPP = gcc OPTS = `pkg-config --libs --cflags gobject-2.0` all: $(CPP) pobobject.c main.c -o gobject-test $(OPTS) clean: rm gobject-test