Barra laterale

programmazione:gobject:introduzione_a_gobject

Introduzione alla Glib Object System

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 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 <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 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 <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__ */
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 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

programmazione/gobject/introduzione_a_gobject.txt · Ultima modifica: 18/04/2018 - 15:49 (modifica esterna)