Autore: Fabio Di Matteo
Ultima revisione: 10/06/2012
Gobject è una libreria libera che permette di utilizzare la logica ad oggetti itramite il linguaggio C. Scritta grazie a 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 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 <glib-object.h> #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 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 <glib-object.h> 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__ */
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 ; }
CPP = gcc OPTS = `pkg-config --libs --cflags gobject-2.0` all: $(CPP) pobobject.c main.c -o gobject-test $(OPTS) clean: rm gobject-test
Il nostro wiki installa solamente cookie tecnici necessari al funzionamento della piattaforma "Dokuwiki". Niente analitics, statistiche, tracciamenti o altro.