ejemplo del sistema de objetos de glib



Estimados.

Adjunto un ejemplo que hice de gobject para que alguien si tiene un
tiempecito le de una miradita... quiero saber si está bien implementado
y si es un buen ejemplo.

Esta es la salida del programa, si les funciona:

avaldes mono:~/ejemplos_C/gobject/2$ ./persona 
flag (dato obtenido por un metodo privado): 100
nombre: matias edad: 1
nombre: alejandro edad: 32
nombre: pamela edad: 28
nombre: jorge edad: 29

Agradezco vuestros comentarios....

Muchas gracias...
-- 
Alejandro Valdés Jiménez.
Area Plataforma
DTI - Dirección de Tecnologías de Información
Universidad de Talca.
Talca - Chile.
Teléfono: (56) (71) 200408
#include <glib.h>
#include "persona-main-app.h"
#include "persona-main-app-private.h"

void
mostrar_datos (GSList *slist)
{
        GSList *nodo = NULL;
	PersonaMainApp *tmp;

        nodo = slist->next;

        if (nodo){
	        while (nodo != NULL){
			tmp = (PersonaMainApp *) nodo->data;
        		g_print ("nombre: %s edad: %i\n", tmp->nombre->str,tmp->edad);
		        nodo = nodo->next;
		}
	}
}

int
main (int argc, char *argv[])
{
        PersonaMainApp *obj;
        GSList *slist = NULL;

        slist = g_slist_alloc ();

        g_type_init();
        obj = persona_main_app_new ();
        obj->agregar_persona (obj,"matias",1);
        slist = g_slist_append (slist,obj);

        obj = persona_main_app_new ();
        obj->agregar_persona (obj,"alejandro",32);
        slist = g_slist_append (slist,obj);

        obj = persona_main_app_new ();
        obj->agregar_persona (obj,"pamela",28);
        slist = g_slist_append (slist,obj);

        obj = persona_main_app_new ();
        obj->agregar_persona (obj,"jorge",29);
        slist = g_slist_append (slist,obj);

	obj->priv->mostrar_datos_privados (obj);

	mostrar_datos (slist);
        return 0;
}
#include "persona-main-app.h"
#include "persona-main-app-private.h"

static void persona_main_app_class_init (PersonaMainAppClass *class);
static void persona_main_app_init (PersonaMainApp *obj, PersonaMainAppClass *class);

static void
persona_main_app_class_init (PersonaMainAppClass *class)
{
	/* register private struct */
	g_type_class_add_private (class, sizeof(PersonaMainAppPrivate));
}

static void
persona_main_app_init (PersonaMainApp *obj, PersonaMainAppClass *class)
{
	obj->priv = G_TYPE_INSTANCE_GET_PRIVATE (obj,PERSONA_TYPE_MAIN_APP, PersonaMainAppPrivate);
	obj->priv->flag = g_string_new ("100");;

	/* asocia método con una función */
	obj->agregar_persona = persona_main_app_agregar_persona;
	obj->priv->mostrar_datos_privados = persona_main_app_private_mostrar_datos;
}

GType
persona_main_app_get_type (void)
{
	static GType type = 0;

	if (!type) {
		static const GTypeInfo info = {
			sizeof (PersonaMainAppClass),
			NULL,		/* base_init */
			NULL,		/* base_finalize */
			(GClassInitFunc) persona_main_app_class_init,
			NULL,		/* class_finalize */
			NULL,		/* class_data */
			sizeof (PersonaMainApp),
			0,		/* n_preallocs */
			(GInstanceInitFunc) persona_main_app_init,
			0
		};
		type = g_type_register_static (G_TYPE_OBJECT,
						"PersonaMainApp",
						&info,0);
	}
	return type;
}

PersonaMainApp *
persona_main_app_new (void)
{
	PersonaMainApp *obj;

	obj = g_object_new (PERSONA_TYPE_MAIN_APP, NULL);

	return obj;
}

void
persona_main_app_agregar_persona (PersonaMainApp *obj, gchar *nombre, gint edad)
{
	obj->nombre = g_string_new (nombre);
	obj->edad = edad;
}


/* funciones datos privados */
void
persona_main_app_private_mostrar_datos (PersonaMainApp *obj)
{
	g_print ("flag (dato obtenido por un metodo privado): %s\n",obj->priv->flag->str);
}
#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif


#ifndef PERSONA_MAIN_APP_H
#define PERSONA_MAIN_APP_H

#include <glib-object.h>

#define PERSONA_TYPE_MAIN_APP            	(persona_main_app_get_type ())
#define PERSONA_MAIN_APP(obj)                  	(G_TYPE_CHECK_INSTANCE_CAST ((obj), PERSONA_TYPE_MAIN_APP, PersonaMainApp))
#define PERSONA_MAIN_APP_CLASS(clas)          	(G_TYPE_CHECK_CLASS_CAST ((klass),  PERSONA_TYPE_MAIN_APP, PersonaMainAppClass))
#define PERSONA_IS_MAIN_APP(obj)         	(G_TYPE_CHECK_INSTANCE_TYPE ((obj), PERSONA_TYPE_MAIN_APP))
#define PERSONA_IS_MAIN_APP_CLASS(clas) 	(G_TYPE_CHECK_CLASS_TYPE ((klass),  PERSONA_TYPE_MAIN_APP))
#define PERSONA_MAIN_APP_GET_CLASS(obj)        	(G_TYPE_INSTANCE_GET_CLASS ((obj),  PERSONA_TYPE_MAIN_APP, PersonaMainApp))


/* el objeto */
typedef struct _PersonaMainApp 		PersonaMainApp;
/* la clase */
typedef struct _PersonaMainAppClass 	PersonaMainAppClass;
/* parte privada (detalle de estructuta en archivo.c) */
typedef struct _PersonaMainAppPrivate      PersonaMainAppPrivate;

struct _PersonaMainApp {
	GObject parent;

	/* atributos públicos */
	GString *nombre;
	gint edad;

	/* definición de métodos públicos */
	void (* agregar_persona) (PersonaMainApp *obj, gchar *nombre, gint edad);

	/* datos privados */
	PersonaMainAppPrivate *priv;
};


struct _PersonaMainAppClass {
	GObjectClass parent_class;
};


GType persona_main_app_get_type (void);
PersonaMainApp *persona_main_app_new (void);
void persona_main_app_agregar_persona (PersonaMainApp *obj, gchar *nombre, gint edad);


#endif    /* PERSONA_MAIN_APP_H */
#ifndef __PERSONA_MAIN_APP_PRIVATE__
#define __PERSONA_MAIN_APP_PRIVATE__

#include "persona-main-app.h"

struct _PersonaMainAppPrivate {
	GString *flag;

	/* definición métodos privados */
	void (* mostrar_datos_privados) (PersonaMainApp *obj);
};

void persona_main_app_private_mostrar_datos (PersonaMainApp *obj);

#endif /* __PERSONA_MAIN_APP_PRIVATE_H__ */
Este ejemplo del sistema de objetos de Glib (GObject), crea una clase llamada 
PersonaMainApp, la cual contiene varios atributos públicos y otros privados.

El programa crea varias instancias y luego muestra los datos en la términal. Además 
muestra un dato privado.


-Compilación:

	gcc main.c persona-main-app.c -o persona `pkg-config --cflags --libs glib-2.0 gtk+-2.0`

- Ejecución:

	./persona


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]