2013-06-24 10 views
5

In C++ è possibile dividere la definizione di classi definite nello stesso file di intestazione su più file sorgente? Ad esempio, se ho un file che definisce le classi Quad2 e Quad3, posso definire la classe Quad2 in un file chiamato Quad2.cpp e Quad 3 in un file chiamato Quad3.cpp, ma avere ancora entrambi nello stesso file di intestazione Quad.h?È legale dividere la definizione di classi definite nella stessa intestazione su più file sorgente?

Questo sarebbe considerato illegale?

+2

Sembra che si stiano implementando classi diverse su file, senza dividere l'una classe. –

+0

Vero, immagino che sarebbe meglio avere una fraseologia per dividere la definizione di classi definite nella stessa intestazione in più file sorgente. Grazie, per il commento aggiornerò la domanda. – teddy

risposta

5

Sì, è possibile implementare classi diverse dallo stesso file di intestazione in diversi file di implementazione.

I file di intestazione non sono altro che contenuto testuale che viene iniettato nell'origine al momento della compilazione. Il compilatore corretto non ha assolutamente alcuna idea di intestazione. Le intestazioni sono risolte nel preprocessore, prima che il compilatore veda qualcosa.

Non esiste quindi alcun requisito su quali file risiedono la definizione e l'implementazione di una classe. Le norme su ciò che appartiene ai file di intestazione e ciò che appartiene ai file di implementazione hanno tutto a che fare con le best practice e nulla a che fare con le regole applicate dal compilatore. Ad esempio, metti le definizioni di classe nelle intestazioni perché questo le rende facili da iniettare sia nell'implementazione di quella classe che in qualsiasi codice che voglia usare la classe.

1

Che totalmente valido. Puoi distrubuire le tue definizioni di funzione in modo selvaggio tra diversi file sorgente. Il linker metterà tutto insieme e si lamenterà, se non trova una definizione.

Ricordare: Scrivere #include <some_header.h> è come copiare il contenuto completo dell'intestazione nel file di origine in quel luogo. Se includi Quad2.h e Quad3.h in entrambi i file di origine Quad2.cpp e Quad3.cpp, questo avrà esattamente lo stesso effetto, come se avessi inserito entrambe le intestazioni in un file Quad.h e incluso quello nei file cpp. Usare coppie di header e file di implementazione è solo una questione di convenzione (ed è una buona idea).

1

Basta provare e vedere di persona! Ma no, non è illegale. Un approccio che confonderebbe un po 'meno le persone (IMHO) sarebbe avere Quad2.h e .cpp, Quad3.h e .cpp e includere Quad2.h e Quad3.h in Quad.h per comodità.

Niente ti costringe a, ma cerca di mantenere il modello X.h associato a X.cpp, è pratica comune.

2

Sì, perfettamente legale. In effetti, puoi avere Quad2A.cpp e Quad2B.cpp se desideri dividere il codice in un file più piccolo (ovviamente, potrebbe non essere di alcun beneficio farlo).

Uno svantaggio con la separazione delle sorgenti, tuttavia, è che si rende più difficile per il compilatore le funzioni inline che sono piccole [o utilizzate una sola volta]. La maggior parte dei compilatori eseguirà solo funzioni integrate nella stessa unità di compilazione. Quindi se Quad3.cpp sta usando qualcosa da Quad2.cpp, allora è possibile che possa essere inline se si trovano nello stesso file, ma non lo sarà se si trovano in file separati. Tuttavia, questo non dovrebbe essere un fattore decisivo per il tuo design, solo menzionarlo come uno degli effetti collaterali di "Let split this".

Problemi correlati