2012-07-17 11 views
8

Eventuali duplicati:
In C++ why have header files and cpp files?Confuso circa lo scopo effettivo di file header in C++

non riesce quasi mai C++ file di intestazione, per due motivi contrastanti:

  1. Pensavo che lo scopo dei file di intestazione fosse in generale quello di separare l'interfaccia e l'implementazione. In altre parole, il client utilizza il file di intestazione per imparare come utilizzare la classe, ma non deve preoccuparsi di come la classe implementa effettivamente questa funzionalità internamente.

  2. Perché, quindi, sono variabili private di una classe C++ specificate nel suo file di intestazione?

Mi sembra che avere variabili private nel file di intestazione violano la separazione tra interfaccia e implementazione. Intuitivamente, penserei che sarebbe più sensato che le variabili private fossero nel file sorgente, poiché questo è il file che non è esposto al mondo esterno.

Forse sto solo fraintendendo lo scopo dei file di intestazione e 1. sopra è completamente sbagliato? In che modo?

+0

Dove hai preso 1. Da? – Robottinosino

+0

Oltre alle funzioni di 'friend', scommetto che è solo una limitazione tecnica per il compilatore a determinare la dimensione della classe. – Mysticial

+0

@DaveSwersky Quel duplicato non risponde alla seconda domanda dell'OP, "Perché, allora, sono le variabili private di una classe C++ specificate nel suo file di intestazione?" – Mysticial

risposta

9

C++ distingue tra dichiarazione e definizione di funzioni e classi. In generale un file di intestazione C++ contiene la dichiarazione di una classe. Poiché non sono consentite dichiarazioni parziali, il file di intestazione deve contenere la dichiarazione completa della classe che include tutti i membri privati ​​(variabili e funzioni membro).

Se si desidera nascondere l'implementazione completa dal pubblico, è possibile utilizzare lo pimpl idiom per ottenere ciò.

6

Lo scopo funzionale principale dei file di intestazione C++ è che nel linguaggio C++ non esistono importazioni di moduli o qualcosa di simile che esiste in altre lingue. L'unico modo per il compilatore di conoscere tipi, funzioni, ecc. Da altri file è di incollare il codice nel file sorgente corrente usando #include.

In teoria è possibile inserire tutto il codice sorgente nell'intestazione e disporre di un solo file di origine che include tutte le intestazioni. Il motivo per cui questo non viene solitamente fatto è duplice. In primo luogo, sarebbe necessario più tempo per compilare (una preoccupazione significativa su alcuni progetti) e qualsiasi modifica a qualsiasi file comporterebbe una ricompilazione completa del progetto. In secondo luogo, mettere l'implementazione in un file sorgente aiuta infatti a separare l'interfaccia dall'implementazione, anche se una parte dell'implementazione è ancora specificata nel file di intestazione.

Nota che i metodi incorporati nelle intestazioni descrivono anche una linea sottile di dettagli di implementazione esposti al pubblico/clienti della classe.

Se si desidera veramente separare completamente l'interfaccia dall'implementazione (che ha un merito definito) il modo C++ per farlo è utilizzare l'idioma pimpl. Usando quell'idioma tutti i dati privati ​​sono nascosti nel file sorgente e solo un'interfaccia astratta viene fornita al pubblico. Inoltre, l'utilizzo del modello di interfaccia non virtuale (NVI) può ulteriormente aiutare a isolare i client dalle modifiche dell'interfaccia.

0

In C/C++, uno scopo dei file di intestazione è consentire a più unità di traduzione di utilizzare tipi con la stessa definizione senza duplicare la definizione su più file.Parte della definizione di una classe sono i suoi membri privati.

3

Lo scopo dei file di intestazione è di fornire al compilatore le informazioni necessarie per condividere le definizioni tra unità di compilazione (file di origine cpp). È una cosa meccanica, non una cosa di filosofia.

Ad esempio, le variabili dei membri privati ​​devono essere dichiarate perché definiscono la dimensione di un oggetto e il compilatore deve conoscere la dimensione quando assegna un oggetto.

+0

Non sarebbe il termine corretto per "condividere dichiarazioni" tra le unità di compilazione? È abbastanza spesso confuso, quali sono i mezzi di dichiarazione e definizione ... –

+0

@ g-makulik, stavo usando "definizioni" nel senso inglese della parola, non l'uso formale del C++. Ed è certamente possibile includere definizioni nell'intestazione, con i modelli per esempio è quasi obbligatorio. –

+0

perché solo le variabili dei membri privati? – zgulser

Problemi correlati