2012-05-06 13 views
5

Tengo bastante claro cuándo puedo/no puedo usar la declaración directa pero todavía no estoy seguro de una cosa.Reenviar declaración/¿cuándo es mejor incluir encabezados?

Digamos que sé que tengo que incluir una cabecera antes o después de retirar la información de un objeto de la clase A. No me queda claro si es más eficiente para hacer algo así ..

class A; 
class B 
{ 
    A* a; 
    void DoSomethingWithA(); 
}; 

y luego en el CPP tienen algo así como ..

#include "A.hpp" 
void B::DoSomethingWithA() 
{ 
    a->FunctionOfA(); 
} 

O puede ocurrir la que también acaba de incluir un encabezado de la a en el archivo de cabecera de B en el primer lugar? Si la primera es más eficiente, agradecería que alguien explicara claramente por qué porque sospecho que tiene algo que ver con el proceso de compilación, lo que siempre podría hacer para obtener más información.

Respuesta

11

Use declaraciones adelantadas (como en el ejemplo) siempre que sea posible. Esto reduce los tiempos de compilación, pero lo que es más importante, minimiza las dependencias del encabezado y la biblioteca para un código que no necesita saber y que no se preocupa por los detalles de la implementación. En general, ningún código que no sea la implementación real debería preocuparse por los detalles de implementación.

Aquí es fundamento de Google en esto: Header File Dependencies

+0

1 Guía de Google C++ Estilo – LihO

+0

aplausos por responder, y el estilo de Google guía parece que va a ser un buen material de lectura gracias! – Holly

+8

Sé que este hilo es viejo, pero creo que debería señalar, por si acaso alguien más busca racionalidad, que el razonamiento de Google parece haber cambiado a "Evitar el uso de declaraciones directas siempre que sea posible. Simplemente # incluya los encabezados que necesita. " – soulsabr

0

No intente hacer su compilación eficiente. Hay dragones. Solo incluya A.hpp en B.hpp.

La práctica estándar para los archivos de cabecera de C y C++ es envolver todo el archivo de cabecera en un #ifdef para asegurarse de que se compila una sola vez:

#ifdef _A_HPP_ 
#define _A_HPP_ 

// all your definitions 

#endif 

De esa manera, si #include "A.hpp" en B.hpp, puede tener un programa que incluya ambos, y no se romperá porque no intentará definir nada dos veces.

4

Cuando utiliza la declaración directa, dice explícitamente con ella "la clase B no necesita saber nada sobre la implementación interna de la clase A, solo necesita saber que la clase llamada A existe". Si puede evitar incluir ese encabezado, evítelo.: es una buena práctica usar la declaración de reenvío en su lugar porque elimina las dependencias redundantes al usarla.

También tenga en cuenta que cuando cambia el archivo de encabezado, hace que se vuelvan a compilar todos los archivos que lo incluyen.

Estas preguntas te ayudarán también:
What are the drawbacks of forward declaration?
What is the purpose of forward declaration?

Cuestiones relacionadas