2009-10-16 3 views
9

Gibt es etwas falsch daran, eine einzelne Klasse (ein .h) über mehrere Quelldateien implementiert zu haben? Ich weiß, dass dies ein Symptom für zu viel Code in einer einzelnen Klasse sein könnte, aber ist da irgendetwas technisch falsch?Eine Klasse mit mehreren Implementierungsdateien

Zum Beispiel:

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() 
{ 
} 

Antwort

13

Das ist in Ordnung. Am Ende wird alles miteinander verbunden sein.

Ich habe sogar Code gesehen, wo jede Mitgliedsfunktion in einer anderen * .cpp-Datei war.

+1

Das würde mich batty fahren. Ich bin mir sicher, dass es gelegentlich gute (oder zumindest anständige) Gründe gibt, dies zu tun, aber aus der Perspektive, das Objektmodell zu verstehen, bleah ... Dateien springen zu müssen, um den Methoden zu folgen. – Joe

+1

Wenn Sie eine Bibliothek erstellen, ermöglicht das Aufteilen jeder Funktion und global in ein eigenes Objekt, dass der Benutzer nur die Bits verknüpft, auf die er verweist, und nicht mehr. Es ist allerdings ärgerlich, damit zu arbeiten. – ephemient

+1

@ephemient: Warum ist das wichtig? Konnte ein Linker die Funktionen, die Sie nicht verwenden, nicht entfernen? Oder dient es nur der Verbesserung der Verbindungszeiten? –

4

Nein, nichts technisch falsch damit. Der Linker bringt alle Teile von Foo in der endgültigen Binärdatei zusammen.

1

Ich habe mit der Apache Portable Runtime gearbeitet, die so ziemlich genau funktioniert. Sie haben eine Kopfzeile, sagen apr_client.h und mehrere Implementierungsdateien für die Funktionen in diesem Header - jede Datei repräsentiert einen Aspekt der Client-Operationen. Es ist nicht falsch, und es ist nicht wirklich ungewöhnlich.

könnte dies ein Symptom zu viel Code in einer einzigen Klasse

C++ ist nicht Java, so dass Sie Ihre Dateinamen nach Ihren Klassennamen nicht wählen müssen.

0

ja, das ist legitim, und in der Tat neuere Sprachen wie C# machen so etwas von der ganzen Zeit.

6

, die legitim ist, und es hat einige (!?) Vorteile ...

Wenn Sie die ausführbare Datei mit der statischen Bibliothek dieser Klasse verknüpfen, nur die verwendeten Funktionen werden bekommen. Das ist sehr praktisch für eine begrenzte -Wesensysteme.

Sie können auch Implementierungsdetails bestimmter Funktionen ausblenden. Zwei Personen können Teile einer Klasse implementieren, ohne voneinander zu wissen. Praktisch für DOD-Projekte.

Wenn Sie zu jeder CRT Quelle betrachten, werden Sie das gleiche Muster sehen ...

+1

Der Punkt, der Implementierungsdetails für die gleiche Klasse versteckt, dehnt es wirklich aus. Wenn Sie eine Klasse haben, die so leicht aufgeteilt werden kann, dann sollte es 2 Klassen und keine Klasse sein. –

+0

@Richard: Nun, ich wollte nur sagen, dass du es kannst, du musst es nicht tun. Wenn die Funktion so einfach ist, dann möchten Sie vielleicht nicht eine separate Klasse dafür erstellen ... – Malkocoglu

+1

@Richard - eh? - Was ist mit einem "Gerät" zum Beispiel foo :: read foo :: write foo :: ioctl Was ist mit den Vorteilen der kürzeren Bauzeiten? – pgast

2

Es ist vollkommen gültig. Alle cpp-Dateien werden miteinander verknüpft.

Dies kann nützlich sein, wie Sie gesagt haben, machen eine sehr große Implementierungsdatei lesbarer und, da jede cpp-Datei eine Kompilierungseinheit ist, könnten Sie diese Tatsache (ab) verwenden. (Unbenannt Namespaces zum Beispiel)

+0

+ für die Erwähnung der erhöhten Möglichkeit für interne Verknüpfung –

0

Es gibt zwei Punkte, die eine Überlegung wert sein können.

Klasse breit Optimierungen:

Wenn der Compiler alle Mitgliedsfunktionen sichtbar zu ihm hat, wenn seine Parsen der Datei (eine einzelne TU Compiler vorausgesetzt), dann kann es in der Lage sein Optimierungen zwischen den verschiedenen Mitglied auszuführen Funktionen.

Code Review

Wenn alle Definitionen für eine Klasse in der gleichen TU, dann macht diese manuelle Codeüberprüfung erleichtert. Wenn die Definitionen in verschiedene TUs aufgeteilt werden, erhöht dies den Aufwand für eine manuelle Überprüfung erheblich, da die entsprechenden Dateien gesucht werden müssen, wobei zwischen den Fenstern ständig geblättert wird, um das "vollständige" Bild zu erhalten.

Verwandte Themen