Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   struct "a pelo" (https://www.clubdelphi.com/foros/showthread.php?t=53837)

Guillermo80 02-03-2008 20:56:05

struct "a pelo"
 
Hola, no hay día que pase sin que me encuentre con cosas cada vez más extrañas (para mí). Se trata de lo siguiente:

Cita:

struct FLAC__StreamEncoderProtected;
struct FLAC__StreamEncoderPrivate;

typedef struct {
struct FLAC__StreamEncoderProtected *protected_; /* avoid the C++ keyword 'protected' */
struct FLAC__StreamEncoderPrivate *private_; /* avoid the C++ keyword 'private' */
} FLAC__StreamEncoder
1) ¿Qué clase de uso es ese de struct, para las dos primeras líneas?

2) ¿Por qué me hace la advertencia de evitar el uso del keyword C++?¿qué leches es eso :o?

3) ¿Me está diciendo algo especial protected y private?

Lepe 03-03-2008 01:39:51

Dios santo, lo que hay que ver. En serio que no tengo ni idea de para qué puede servir eso :D.

Las dos primeras líneas son "declaraciones por adelantado" (forward declaration) ya que se van a usar el tipo de dato en la definicion del propio tipo de dato.

Con clases quizás se vea más claro:
Código Delphi [-]

type  A; // fordward declaration, le decimos al compilador que A es un tipo de datos.

type  A = class(TObject)
public
   Subclase : A;
end;
Si omitimos la declaración por adelantado, el compilador se quejará en la línea:
Subclase : A
porque no se ha terminado de definir el tipo de datos "A" y ya se está haciendo uso de él.

La advertencia sobre "protected" keyword, es que quiere declarar uno de los campos con el nombre "protected" pero eso no está permitido porque es una palabra reservada del propio lenguaje C++, la solución pasa por añadir un guión bajo, de esa forma C++ no lo reconoce como una palabra reservada y puede compilarse.

poquito enrevesado ¿qué no? :D

Saludos

Guillermo80 03-03-2008 20:52:43

avanzamos
 
Gracias Lepe, ha estado bien la explicación, y me sirve. Lo de protected y private te iba a decir que en Delphi son palabras reservadas, pero aquí pues no estaba seguro, y el guion bajo pues como que me despistó un poco. Por otra parte, lo curioso de todo esto es que me he encontrado con una contradicción de lo más pura:

1) Si se hace una "declaración por adelantado" significaría que no necesitaría ser definido en otro sitio, sin embargo , para FLAC__StreamEncoderProtected sí que tengo en otro sitio la definición de ese registro.

2) Si entonces debería existir ambas declaraciones de registros por otra parte, así como la he encontrado para FLAC__StreamEncoderProtected, la debería encontrar para FLAC__StreamEncoderPrivate, ¿no? Si la respuesta es que "es que esto es privado y no lo ves", necesito que me argumenten un poco de qué va la película.:p

escafandra 04-03-2008 01:18:26

Las declaraciones por adelantado le dicen al compilador, "no te preocupes, mas adelante te diré lo que es, por ahora trabaja con esto y no lo consideres un error". Claro que debe estar declarado mas adelante, o de lo contrario el compilador dará el consiguiente error de compilación.

Si no has encontrado una declaración, no significa que no esté. Probablemente la encuentres en otro archivo cabecera. Private no significa que no la ves, sino que no se puede acceder a esos miembros (privados) desde fuera de la clase y, además, que si derivas una clase o estructura, ésta estructura derivada no ve los miembros privados de la clase madre. En todo momento las declaraciones deben existir.


La franja horaria es GMT +2. Ahora son las 07:35:27.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi