Le guardie di inclusione
Tutti i file di intestazione (*.h) devono avere una guardia di inclusione per evitare errori dovute ad inclusioni multiple dello stesso file.
La guardia di inclusione dovrebbe comparire subito prima del commento di intestazione e comprendere l'intero contenuto del file.
Esempio:
#ifndef _FOOBAR_H
#define _FOOBAR_H
. . . codice sorgente . . .
#endif // _FOOBAR_H
I file di intestazione (header)
Il file di intestazione di una classe C++, dovrebbe includere solamente i file header che sono necessari per la definizione della classe. Più precisamente un file header dovrebbe essere incluso solo se:
- fornisce la definizione della classe base
- contine le definizioni delle classi a cui fanno riferimenti i dati mebri o i metodi della classe.
Puntatori e reference ad oggetti, non richiedono l'inclusione dell'header con la definizione dell'oggetto corrispondente, ma è sufficiente sfruttare la dichiarazione anticipata della classe (forward class declaration).
Dichiarazione anticipata di una classe
La dichiarazione anticipata dovrebbe essere utilizzata al posto dell'inclusione di file di intestazione per le classi che sono riferite tramite puntatori o riferimenti. Ad esempio se un metodo ha come parametro CFoo*, è sufficiente utilizzare una dichiarazione anticipata della classe CFoo per compilare il file senza ricevere errori. Questa possibilità aiuta a mantenere "leggera" l'interfaccia di un oggetto, cosí che gli utilizzatori di tale interfaccia non sono sottoposti ad inutili dipendenze.
L'utilizzo di dichiarazioni anticipate è anche un buona pratica di sicurezza, poiché elimina la necessità di esporre inutilmente tutti i sorgenti al codice "client".
Example:
// includes
//------------------------------
#include “foobarbase.h”
#include “someclass.h”
// forward declarations
//------------------------------
class COtherClass;
class CFooBar : public CFooBarBase {
public :
CSomeClass m_SomeClass;
COtherClass * m_pOtherClass;
};
d45c2c40-99d0-460d-aeba-efb3b044bd39|0|.0