2012-05-06 14 views
5

Sono abbastanza chiaro quando posso/non posso usare la dichiarazione di inoltro ma non sono ancora sicuro di una cosa.Inoltra dichiarazione/quando è meglio includere intestazioni?

Diciamo che io so che devo includere un'intestazione prima o poi di de-riferimento un oggetto della classe A. Io non sono chiare sul fatto che sia più efficiente per fare qualcosa di simile ..

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

e poi nel cpp avere qualcosa di simile ..

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

O potrei anche semplicemente includere colpo di testa di a nel file di intestazione di B, in primo luogo? Se il primo è più efficiente allora sarei grato se qualcuno spiegasse chiaramente perché sospetto che abbia qualcosa a che fare con il processo di compilazione che potrei sempre fare con l'apprendimento di più.

risposta

11

utilizzare le dichiarazioni a termine (come nel tuo esempio), quando possibile. Questo riduce i tempi di compilazione, ma soprattutto minimizza le dipendenze di intestazione e libreria per codice che non ha bisogno di conoscere e non si cura dei dettagli di implementazione. In generale, nessun codice diverso dall'attuale implementazione dovrebbe interessarsi ai dettagli di implementazione.

Ecco logica di Google su questo: Header File Dependencies

+0

+1 per Google C++ Guida stile – LihO

+0

applausi per rispondere, e lo stile Googles guida sembra che sarà un grande letto, grazie! – Holly

+8

So che questo thread è vecchio, ma penso che dovrei far notare, nel caso in cui qualcun altro è alla ricerca di motivazioni, che la motivazione di Google sembra essere stata modificata in "Evita di utilizzare le dichiarazioni avanzate laddove possibile" # include solo le intestazioni di cui hai bisogno. " – soulsabr

0

Non tentare di rendere efficiente la compilazione . Ci sono draghi. Basta includere A.hpp in B.hpp.

La pratica standard per C e C++ file di intestazione è quello di avvolgere tutti i file di intestazione in un #ifdef per assicurarsi che sia compilata una sola volta:

#ifdef _A_HPP_ 
#define _A_HPP_ 

// all your definitions 

#endif 

In questo modo, se si #include "A.hpp" in B.hpp, puoi avere un programma che include entrambi e non si romperà perché non tenterà di definire qualcosa due volte.

4

Quando si utilizza la dichiarazione diretta, si dice esplicitamente con esso "la classe B non ha bisogno di sapere nulla sull'implementazione interna della classe A, deve solo sapere che esiste la classe A". Se è possibile evitare di includere quell'intestazione, quindi evitarlo. - È preferibile utilizzare invece la dichiarazione di inoltro perché si eliminano le dipendenze ridondanti utilizzandolo.

Si noti inoltre che quando si modifica il file di intestazione, vengono ricompilati tutti i file che lo includono.

Queste domande ti aiuterà anche:
What are the drawbacks of forward declaration?
What is the purpose of forward declaration?