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:

[EMAIL PROTECTED]:~/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

Responder a