2009-10-16 10 views
9

C'è qualcosa di sbagliato nell'avere una singola classe (una .h) implementata su più file sorgente? Mi rendo conto che questo potrebbe essere un sintomo di troppo codice in una singola classe, ma c'è qualcosa di tecnicamente sbagliato in questo?Una classe con più file di implementazione

Ad esempio:

foo.h

class Foo 
{ 
    void Read(); 
    void Write(); 
    void Run(); 
} 

Foo.Read.cpp

#include "Foo.h" 
void Foo::Read() 
{ 
} 

Foo.Write.cpp

#include "Foo.h" 
void Foo::Write() 
{ 
} 

Foo.Run.cpp

#include "Foo.h" 
void Foo::Run() 
{ 
} 

risposta

13

Questo va bene. Alla fine, sarà tutto collegato insieme.

Ho persino visto il codice, in cui ogni funzione membro si trovava in un diverso file * .cpp.

+1

Questo mi farebbe impazzire. Sono sicuro che ci sono motivi occasionalmente buoni (o almeno decenti) per farlo, ma dal punto di vista di cercare di capire il modello dell'oggetto, bleah ... di dover saltare i file per seguire i metodi in giro. – Joe

+1

Se si crea una libreria, la suddivisione di ogni funzione e globale nel proprio oggetto consente al consumatore di collegare solo i bit a cui fa riferimento e non più. È fastidioso lavorare con, però. – ephemient

+1

@ephemient: perché questo importa? Un linker non può escludere le funzioni che non usi? O è solo per migliorare i tempi di collegamento? –

4

No, tecnicamente non funziona. Il linker porterà tutti i pezzi di Foo insieme nel binario finale.

1

Ho lavorato con Apache Portable Runtime, che fa praticamente questa cosa esatta. Hai un'intestazione, diciamo apr_client.h e più file di implementazione per le funzioni in quell'intestazione: ogni file rappresenta un aspetto delle operazioni client. Non è sbagliato, e non è davvero insolito.

questo potrebbe essere un sintomo di troppo codice in una sola classe

C++ non è Java, quindi non c'è bisogno di scegliere i nomi di file in base alle proprie nomi di classe.

0

sì, è legittimo, e in effetti le lingue più recenti come C# fanno quel genere di cose di sempre.

6

Questo è legittimo e ha alcune (!?) Ai vantaggi ...

Se si collega il vostro eseguibile con la libreria statica di questa classe, solo le funzioni utilizzate si metterà in. Questo è molto utile per la limitata sistemi di risorse.

È inoltre possibile nascondere i dettagli di implementazione di alcune funzioni. Due persone possono implementare parti di una classe senza conoscersi l'una con l'altra. Comodo per i progetti DOD.

Se si guarda a qualsiasi sorgente CRT, si vedrà lo stesso modello ...

+1

Il punto che nasconde i dettagli di implementazione per la stessa classe lo sta davvero allungando. Se hai una classe che può essere suddivisa così facilmente, allora dovrebbe essere 2 classi non una. –

+0

@Richard: Beh, volevo solo dire che puoi farlo, non devi farlo. Se la funzione è così semplice, potresti non preferire creare una classe separata per questo ... – Malkocoglu

+1

@Richard - eh? - Che dire di un "dispositivo" per esempio foo :: read foo :: write foo :: ioctl per quanto riguarda i vantaggi dei tempi di costruzione più brevi? – pgast

2

è perfettamente valida. Tutti i file cpp saranno collegati insieme.

Questo può essere utile per, come hai detto, rendere un file di implementazione molto grande più leggibile e, poiché ogni file cpp è un'unità di compilazione, è possibile (ab) utilizzare tale fatto. (Spazi dei nomi senza nome per esempio)

+0

+ per menzionare la maggiore opportunità di collegamento interno –

0

Ci sono due punti che potrebbero valere la pena considerare.ottimizzazioni larghe

Classe:

Se il compilatore contiene tutte le funzioni membro visibili ad esso quando la sua analisi del file (assumendo un singolo compilatore TU) allora può essere in grado di eseguire ottimizzazioni tra i vari Stati funzioni.

Code Review

Se tutte le definizioni per una classe si trovano nella stessa TU, quindi questo rende la revisione del codice manuale più facile. Se le definizioni sono suddivise in diverse TU, ciò aumenta in modo significativo lo sforzo richiesto per una revisione manuale, in quanto è necessario cercare i file appropriati, con un rapido sfogliamento tra le finestre per ottenere l'immagine "completa".

Problemi correlati