2009-06-02 29 views
7

Estoy actualizando algunos códigos y mientras estaba trabajando en un encabezado, encontré la siguiente línea.Definición de clase de una línea?

. 
. 
. 
class HereIsMyClass; 
. 
. 
. 

Eso es todo. Es solo una línea que precede a otra definición de clase más larga. HereIsMyClass es de hecho otra clase en otro lugar, pero no entiendo por qué esta línea está escrita aquí. ¿Qué hace?

Respuesta

27

Esta línea en C++ es una declaración directa. Está indicando que en algún momento en el futuro una clase llamada HereIsMyClass probablemente existirá. Le permite usar una clase en una declaración antes de que esté completamente definida.

Es útil tanto para dividir clases dependientes de forma circular como para administrar archivos de cabecera.

Por ejemplo

class HereIsMyClass; 

class Foo { 
    void Bar(HereIsMyClass* p1) ... 
}; 

class HereIsMyClass { 
    void Function(Foo f1); 
} 
3

Esto es lo que se llama un predeclaration. Es probable que haya una definición de clase siguiendo esta línea que usa HereIsMyClass, cuando la declaración real de HereIsMyClass está más abajo en el archivo, o en otro #incluido incluido más abajo en el archivo.

Si no tiene esa línea, es posible que el archivo no se compile.

+2

Me sorprendió: ¡pensé que se llamaba "declaración directa" pero Google muestra aproximadamente 10 veces más visitas para la predeclaración! – xtofl

+1

También lo habría llamado "declaración avanzada". Google muestra aproximadamente 6500 visitas solo para predeclaración con un cliente alemán, y ninguno de los primeros éxitos tiene algo que ver con la programación. – OregonGhost

+0

A decir verdad, olvidé el término "declaración directa" y en su lugar usé las reglas inglesas estándar para escribir la predeclaración. Piénselo: su declaración de algo antes de que lo declare en otro lugar. Los dos términos son esencialmente intercambiables. Si alguien puede encontrar el nombre de esta técnica codificado en un libro en algún lugar (no pude encontrar una declaración futura o predeclaración en el índice de K & R), sería genial notarlo aquí. –

4

Se denomina "declaración directa". Esto le dice al compilador que 'HereIsMyClass' es el nombre de una clase (versus el nombre de una variable, una función u otra cosa). La clase tendrá que definirse más tarde para que se use.

Esto es útil cuando tiene clases que necesitan referirse entre sí.

Here's una descripción.

1

Esto se denomina "declaración directa", que es esencialmente una promesa de definir esta clase más adelante. Tener una declaración directa le permite declarar punteros al HereIsMyClass sin tener que incluir el archivo de encabezado, pero no los objetos reales de la misma, porque el tamaño de un objeto de HereIsMyClass aún es desconocido para el compilador.


class HereIsMyClass; 

class Foo 
{ 
private: 
    HereIsMyClass *pointer; // works 
    HereIsMYClass object; // compiler error! 
}; 

La declaración más adelante le dice al compilador nada acerca de los miembros de la clase, por lo que aún tienen que incluir la definición de clase completa (el archivo de cabecera) cada vez que realmente se utilicen, i. mi. acceda a sus miembros.

Cuestiones relacionadas