El Wed, 18-04-2007 a las 09:18 -0400, Alejandro Valdes Jimenez escribió:
> On Tue, 2007-04-10 at 16:22 -0400, Germán Poó Caamaño wrote:
> > 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. 

Voy a tratar de explicar más claramente esto, creo que quizás no fuí
100% explícito (cosas que pasan cuando uno conoce el código de memoria y
asume que para el resto es igual de claro).

La razón por la que el código está separado en gyrus-admin.c y
gyrus-admin-mailbox.c es netamente para ordenar un poco el código de la
clase GyrusAdmin. Sin embargo, ambos archivos *son parte* de la clase, y
son los únicos que deben tener acceso a los elementos privados.

> 
> me queda claro el "como" deben separarse las definiciones sin embargo, a
> riesgo de quedar como "humbertiro", cuando necesito utilizar tal
> structura privada desde otro archivo .c no funcionará (en la compilación
> se verá reflejado),

No debes acceder a la estructura GyrusAdminPrivate desde ningún
archivo .c que no sea los antes mencionados. No hay razón para hacerlo.
Para eso existen los métodos públicos (los definidos en gyrus-admin.h).

>  en ese caso no me queda mas opción que definir la
> estructura privada en el .h e incluir esa cabecera en el otro
> archivo .c. pero eso no cumple con lo que me indicas.

Debes incluirlo en gyrus-admin.c y gyrus-admin-mailbox.c, y sólo ahi.
Ambos archivos *son* la clase GyrusAdmin. gyrus-admin-mailbox.c *no es*
una clase distinta. 
> 
> Será esto último un indicio de que talvés el código está desordenado?,

No exactamente. El código está separado por comodidad. Piensa un poco en
C# desde el dialecto 2.0. Puedes definir una clase parcialmente en
archivos diferentes, si eso te ayuda a ordenar el código.

> ¿como lo hago cuando desde otro archivo .c necesito utilizar la
> estructura privada definida en otro archivo .c?

No puedes. A menos que incluyas el archivo .c donde la estructura está
definida, lo cual es muy mala idea.

> talvés me estoy ahogando en un vaso de agua...

Yo creo que sí. De todas maneras, esta discusión está +- offtopic.
Podemos continuarla en [EMAIL PROTECTED] o en el reporte del bug
relacionado con esto[1] (a menos que la audiencia pida a gritos que nos
quedemos :-)

Claudio

[1] http://bugzilla.gnome.org/show_bug.cgi?id=429138


-- 
Claudio Saavedra <[EMAIL PROTECTED]>

Responder a