ejemplo del sistema de objetos de glib
- From: Alejandro Valdes Jimenez <avaldes utalca cl>
- To: "Advocacy, chit-chat and event planning in Chile" <gnome-cl-list gnome org>
- Subject: ejemplo del sistema de objetos de glib
- Date: Fri, 04 May 2007 10:28:01 -0400
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]