2010-05-14 12 views
5

Tengo un problema con respecto a la inclusión múltiple del archivo de encabezado en el código C++.Inclusión múltiple del archivo de encabezado C++

decir, por ejemplo, tengo tres clases X, Y, Z. X e Y se derivan de la clase base Z. Y quiero crear una instancia de X en Y. El código será así.

class Z{some code} 

class X:public Z{some code};//here #include header of class Z added 

class Y:public Z //here #include header of class Z added as well as of X class 

{private: 
    X* mX;//instance of X 

some code}; 

En esta definición múltiple de todos los métodos de la clase base se presenta. ¿Cómo puedo hacer frente a este problema

+0

posible duplicado de [redefinición C++] (http://stackoverflow.com/questions/2823330/redefinition-c) –

Respuesta

8

El uso de "incluir guardias" (Wikipedia link)

#ifndef MYHEADER_H 
#define MYHEADER_H 

// header file contents go here... 

#endif // MYHEADER_H 

Este es el código idiomático, fácilmente reconocible por cualquier avezado C y programador de C++. Cambie MYHEADER_H a algo específico para usted, por ejemplo, si el encabezado define una clase llamada CustomerAccount, puede llamar al guardia CUSTOMERACCOUNT_H.


En su caso específico, tenga un encabezado/archivo de origen por separado para cada clase. El archivo de cabecera para la clase Z tendrá una guardia incluir:

#ifndef Z_H 
#define Z_H 

// Code of Z class 

#endif Z_H 

Ahora, las cabeceras de ambos X e Y puede incluir z.h con seguridad - sólo realmente se incluirá una vez en un archivo .cpp que incluye tanto x.h y y.h y no se producirá ninguna duplicación.

Siempre tenga en cuenta que en C y C++ lo que realmente se compila son los archivos de origen (.c o .cpp), no los archivos de encabezado. Los archivos de encabezado son simplemente "copiados y pegados" por el preprocesador en los archivos de fuentes que los include.

+0

puede por favor más específico con mi ejemplo si no te importa – boom

+0

@iSight: actualizado. ¿Es suficiente? –

+0

Muchas muchas gracias mucho. Funcionó. – boom

1

Utiliza lo que se llama incluyen guardias o protectores de cabecera. Ellos más o menos así:

// within some_header.h 
#ifndef SOME_HEADER_H 
#define SOME_HEADER_H 

// stuff goes here 

#endif 

En esencia, la primera vez en todo el macro no se ha definido por lo que todo el interior está incluido. Sin embargo, después de la primera vez subsiguiente incluye no tendrá ningún efecto.

El esquema de nombres, como todos los esquemas de nombres, es completamente arbitrario y depende de usted. Me gusta incluir el nombre del archivo como mínimo, como hice anteriormente, de esa manera. También incluyo espacios de nombres y nombres de proyectos en mis proyectos reales.

Hay un par de cosas que hay que tener en cuenta. Es posible que tenga la tentación de hacer cosas como esta:

#define _SOME_HEADER_H__ 

Para ofuscarlo un poco. Sin embargo, los nombres que comienzan con un guión bajo seguido de una letra mayúscula o contienen guiones bajos dobles son identificadores reservados, y usted no puede usarlos.

3

También puede usar #pragma una vez directiva de preprocesador en archivos de encabezado. (No hay necesidad de preocuparse por #ifndef #define #endif)

+0

dónde utilizar esta directiva en el encabezado de clase base o el encabezado de clase derivada. – boom

+0

@iSight necesita definir todos los archivos de encabezado de clases (base y derivación) – santhosh

+0

+1 para #pragma una vez – hyde

Cuestiones relacionadas