Re: private data con gobject en C



On Tue, 2007-04-10 at 15:43 -0400, Alejandro Valdes Jimenez wrote:
> Estimados...
> 
> Alguien  (claudio en particular. jejejeje)  puede explicar como definir
> datos privados en la definición de un objeto de una clase con gobject en
> C?
> 
> Vi como lo hace en gyrus, pero no me queda claro en que momento se
> indica explicitamente que tal o cual dato es privado.

No soy Claudio, tampoco he visto el código de Gyrus.  Pero la situación
es más o menos de la siguiente forma:

Se tiene MyObject, entonces tu archivo de encabezado tendrás:

typedef struct _MyObjectPriv MyObjectPriv;

A diferencia de MyObject y MyObjectClass, la definición de MyObjectPriv
no la añades en el .h; por razones obvias: No quieres que nadie utilice
los datos de una estructura privada.  En el .h sólo van los símbolos que
quieres exportar.

Luego, en el .c declaras _MyObjectPrivate.  Todos los elementos de 
dicha estructura son privados; dado que son visibles dentro del ámbito
del archivo .c y nada más.

Además, cuando se inicializa la clase (función my_object_class_init),
inicializas los atributos privados.  **Debe hacerse al último**[1]
Sería algo así como:

g_type_class_add_private (object_class, sizeof (MyObjectPrivate));

Cuando se inicializa una instancia (función my_object_init), entonces
aplicas:

static void
my_object_init (MyObject *my_object)
{
   ...
   my_object->priv = G_TYPE_INSTANCE_GET_PRIVATE (my_object, 
                           MY_TYPE_OBJECT, MyObjectPrivate);
   ...
}

Luego, ya puedes usar my_object->priv->atributo.

La lectura recomendada es "The Glib Object system":
http://le-hacker.org/papers/gobject/

[1] Para garantizar la compatibilidad binaria entre versiones (ABI),
pudiendo añadir la cantidad de atributos privados que desees en
cualquier momento.

-- 
Germán Poó Caamaño
Concepción - Chile




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