Domanda

Alcune classi, come le eccezioni o i template, necessitano solo del file header (.h), spesso non c'è .cpp correlato ad esse.

Ho visto che alcuni progetti erano (per alcune classi) non ci sono file .cpp associati ai file delle intestazioni, forse perché l'implementazione è così breve che viene eseguita direttamente in .h, o forse per altri motivi , ad esempio le classi di modelli, in cui è obbligatorio includere l'implementazione nell'intestazione.

Qual è la tua opinione, se una classe è troppo corta, dovrei evitare di creare un file .cpp e scrivere il codice direttamente sul file di intestazione? Se il codice è scritto nel file di intestazione, dovrei includere un .cpp vuoto in modo che i file nel progetto rimangano coerenti?

È stato utile?

Soluzione

Non aggiungerei file .cpp non necessari. Ogni file .cpp che aggiungi deve essere compilato, il che rallenta il processo di compilazione.

In generale, usare la tua classe richiederà comunque solo il file header - non vedo alcun vantaggio per un " vuoto " File .cpp per coerenza nel progetto.

Altri suggerimenti

No. Se non c'è nulla che deve essere nel .cpp, non ne hai bisogno.

C'è un vantaggio nel creare sempre un .cpp per ogni .h, anche quando il primo sarebbe vuoto: impone al momento della compilazione che i file di intestazione siano autonomi. Questo è in relazione con le linee guida di includere foo.h prima in foo.cpp :

  

Con l'ordinamento preferito, se dir2 / foo2.h omette qualsiasi inclusione necessaria, la generazione di dir / foo.cpp si interromperà. Pertanto, questa regola garantisce che le interruzioni di compilazione vengano visualizzate per prime per le persone che lavorano su questi file, non per le persone innocenti in altri pacchetti.

È davvero cavalli per corsi:

  • Classi solo intestazione: ad es. modello classi
  • Header e cpp: separa la dichiarazione dall'implementazione.
  • solo cpp: il tuo main () può vivere in uno di questi.

Il solo codice sorgente del file di intestazione è talvolta l'unico modo per scrivere modelli riutilizzabili. Vedi boost per molti esempi di ciò.

Header e cpp sono più "normali". Separa la dichiarazione dall'implementazione e può accelerare la compilazione quando il compilatore non deve leggere le implementazioni un sacco di volte. Potresti voler iniziare qui e quindi vedere come va l'implementazione e se il file cpp diventa vuoto puoi eliminarlo.
Un altro punto qui è che avrai il tuo #include " foo.h " nella parte superiore di foo.cpp per dimostrare che chiunque può farlo e non avere un compilatore errori.

Solo file cpp. main () può vivere qui e ho inserito le classi di test cppUnit in file come questo.

Regola empirica, mantieni insieme la classe correlata nello stesso file. Classi molto diverse devono inserire i propri file .hpp e .cpp. La ragione di ciò è che in progetti di grandi dimensioni hai un massimo di 10.000 classi e di mettere quel numero di file davanti all'utente e all'IDE normalmente fa andare in pezzi.

Esistono librerie molto utili e di successo, come molte altre in boost , che sono solo intestazione.

Se alcune classi sono brevi e sembrano inaffinabili, tendo a metterle tutte insieme in types.h - l'unica intestazione che non considero meritare un file .cpp.

Comunque la maggior parte delle classi supera sia la possibilità di andare solo nell'intestazione, sia la possibilità di andare in types.h .

Alcuni esempi di ciò che faccio. Considero la classe per l'implementazione del vettore tridimensionale Vector3 per meritare i suoi .h e .cpp, nonostante sia semplice. Ma Position non lo merita davvero; dopo tutto, sarebbe persino un P.O.D. struttura, se non fosse per quel fastidioso getDistance () che mi piace implementato lì.

Quindi no - non tutte le classi meritano i loro file .cpp e .h. Ma la maggior parte lo fa e quelli che sicuramente non riescono a stare in una testata solitaria. Se sono così corti da inserirsi solo nell'intestazione, o si stringono insieme ad altre classi brevi o vanno nell'intestazione della classe a cui sono strettamente legati.

La mia regola empirica è che qualsiasi metodo che ho bisogno di più di una riga di codice per esprimere va in un file .cpp .

Per un'ulteriore discussione di questo problema, potresti voler dare un'occhiata a questa mia vecchia domanda: Codice C ++ nei file di intestazione . Non credo che la tua domanda sia esattamente un duplicato, ma è abbastanza vicina da leggerla.

Vedi anche questa domanda - i file di intestazione dovrebbero essere solo per le dichiarazioni.

Se il codice compilabile è incluso in più punti (dal tuo commento: "dovrei evitare di creare un file .cpp e scrivere il codice direttamente sul file di intestazione?"), verrà compilato ogni volta (anche se tu potrebbe avere intestazioni precompilate) e il linker risolverà (o meno) il codice oggetto gonfiato.

Solo perché la definizione della classe è piccola non significa che dovrebbe essere nel file di intestazione a meno che la definizione sia uguale alla dichiarazione - ad es. una pura classe virtuale o un tipo semplice come indicato nell'altra risposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top