2011-02-07 21 views
9

This answer dice:¿Qué es la declaración directa en C++?

... Por último,

typedef struct { ... } Foo; 

declara una estructura anónima y crea un typedef para ello. Por lo tanto, con este constructo, no tiene un nombre en el espacio de nombre de etiqueta, solo un nombre en el espacio de nombres typedef. Esto significa que tampoco puede ser declarado adelante. Si desea hacer una declaración directa, debe darle un nombre en el espacio de nombre de la etiqueta.

¿Qué es forward declaration?

+0

No se puede reenviar declarar una * anonymous * struct. – John

+0

@FredN Realmente no estoy seguro de a lo que apunta. (Esto no es ayudado por el enlace __ "esta respuesta" __ enlazando con __ la pregunta__, por lo que no sabemos a qué respuesta se refería). En C++, puede reenviar-declarar una clase, pero no un nombre de tipodef. Una "declaración avanzada" de una clase es una declaración de clase. – sbi

+0

@sbi: Aunque tiene razón en que el OP era impreciso (y nuevo en el sitio, por lo que no sabía cómo vincularlo correctamente a una respuesta específica), solo hay dos respuestas sobre esa pregunta que dicen que no puede reenviar declarar un typedef, y alguien que mire cualquiera de esas respuestas (he incluido la cita más completa de una respuesta anterior) tendrá el contexto necesario para responder realmente a esto. –

Respuesta

15

Chad ha dado una muy buena definición del diccionario. Las declaraciones a futuro se usan a menudo en C++ para tratar con relaciones circulares. Por ejemplo:

class B; // Forward declaration 

class A 
{ 
    B* b; 
}; 

class B 
{ 
    A* a; 
}; 
+1

Vale la pena señalar que solo se puede declarar 'B' como un puntero o un tipo de referencia porque es lo que se llama _complete tipo_. –

7

"En la programación informática, una declaración directa es una declaración de un identificador (que denota una entidad como un tipo, una variable o una función) para la cual el programador aún no ha dado una definición completa."

- Wikipedia

+0

He leído la publicación vinculada. Y creo que esto responde la pregunta (tanto en el título como en la publicación) "¿Qué es la declaración directa?" Las estructuras anónimas son discutibles para la pregunta, aunque el OP es incorrecto al decir que typedefs no pueden ser declarados hacia adelante. –

+4

Las tautologías no son la respuesta: http://xkcd.com/703/ – allyourcode

2

Una declaración fowrard declara el identificador (lo pone en un espacio de nombres) antes de la definición real. Se necesita reenviar la declaración de estructuras si necesita usar un puntero a la estructura antes de que se defina la estructura.

En el contexto de la respuesta que vinculó, si tiene typedef struct {...} Foo;, no puede usar un puntero a Foo dentro de la estructura o antes del final de la instrucción typedef.

Por otro lado se puede typedef struct tagFoo Foo; y más tarde struct tagFoo {...};

+0

No hay necesidad de un nuevo nombre: typedef struct Foo Foo; struct Foo {}; –

+0

Buena respuesta, pero tenga en cuenta que también puede usar las declaraciones directas de clases y estructuras como parámetros de función y valores devueltos. – Tom

3

A lo mejor de mi conocimiento, en C++ the term "forward declaration" is a misnomer. Es simplemente una declaración bajo un nombre de fantasía.

+0

Gracias por aclarar que este NO es un tipo especial de declaración. ¡Es muy fácil pensar que es por la manera en que la gente lo discute! – allyourcode

+0

Por otro lado, ¿por qué las personas vieron la necesidad de crear un término especial para un concepto que no es tan especial? – allyourcode

+1

@allyourcode: TTBOMK Stroustrup introdujo ese nombre décadas antes de que se redactara la redacción estándar que cité en la respuesta a la que me he vinculado. Solo puedo suponer que el nombre fue elegido según el uso de esa declaración, mientras que nadie pensó en el panorama general. Recuerde que C++ evolucionó de acuerdo con las necesidades concretas, mientras que aquellos que lo usaban lo siguieron. (Sí, todo se agregó de acuerdo con el principio de no agregar características para admitir un solo caso de uso. Lo que estaba tratando de decir es que no nació completamente en un solo acto de creación). – sbi

0

La declaración de reenvío es necesaria cuando un miembro de la clase utiliza una referencia de otra clase en ella. Por ejemplo:

class AB; // forward declaration 
class A { 
public: 
    int j; 
    void sum(AB a) { 
     return a.i + j; 
    } 
}; 
class AB{ 
public: 
    int i; 
}; 
Cuestiones relacionadas