2009-06-02 7 views
7

Sto aggiornando del codice e mentre lavoravo in un'intestazione, ho trovato la seguente riga.Definizione della classe di una riga?

. 
. 
. 
class HereIsMyClass; 
. 
. 
. 

Questo è tutto. È solo una riga che precede un'altra definizione di classe più lunga. HereIsMyClass è in realtà un'altra classe da qualche altra parte, ma non capisco perché questa riga è scritta qui. Che cosa fa?

risposta

27

Questa riga in C++ è una dichiarazione diretta. Sta affermando che ad un certo punto in futuro probabilmente esisterà una classe chiamata HereIsMyClass. Ti permette di usare una classe in una dichiarazione prima che sia completamente definita.

È utile sia per separare le classi circolarmente dipendenti sia per la gestione dei file di intestazione.

Per esempio

class HereIsMyClass; 

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

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

Questo è ciò che è chiamato un pre-dichiarazione. Probabilmente esiste una definizione di classe che segue questa riga che utilizza HereIsMyClass, quando la dichiarazione effettiva di HereIsMyClass è più avanti nel file o in un'altra # include incluso più in basso nel file.

Se non si dispone di quella linea, è possibile che il file non venga compilato.

+2

Sono rimasto sorpreso: ho pensato che si chiamasse "forward statement", ma Google mostra circa 10 volte più hit per la predeclaration! – xtofl

+1

L'avrei chiamato anche "dichiarazione diretta". Google mostra circa 6500 hit solo per la predeclaration con un client tedesco, e nessuno dei primi hit ha qualcosa a che fare con la programmazione. – OregonGhost

+0

Sinceramente, ho dimenticato il termine "forward statement", e invece ho usato regole inglesi standard per scrivere la predeclaration. Pensaci: il tuo dichiarare qualcosa prima di dichiararlo da qualche altra parte. I due termini sono essenzialmente intercambiabili. Se qualcuno può trovare il nome di questa tecnica codificato in un libro da qualche parte (non potrei trovare la dichiarazione foward o la predeclaration nell'indice di K & R), sarebbe bello notare che qui. –

4

Si chiama "dichiarazione anticipata". Questo dice al compilatore che 'HereIsMyClass' è il nome di una classe (rispetto al nome di una variabile, una funzione o qualcos'altro). La classe dovrà essere definita in seguito per essere utilizzata.

Questo è utile quando si hanno classi che devono fare riferimento l'una all'altra.

Here's una descrizione.

1

Questo è chiamato "dichiarazione anticipata", che è essenzialmente una promessa per definire questa classe in seguito. Avere una dichiarazione diretta consente di dichiarare i puntatori a HereIsMyClass senza dover includere il file di intestazione per esso, ma non gli oggetti effettivi, poiché la dimensione di un oggetto di HereIsMyClass è ancora sconosciuta al compilatore.


class HereIsMyClass; 

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

La dichiarazione anticipata dice al compilatore nulla circa i membri della classe, quindi è ancora necessario includere la definizione della classe completo (file di intestazione) ogni volta che si utilizza in realtà, io. e. accedi ai suoi membri.