6 Stimmen

Was sind die Nachteile der Verwendung von C++-Headern (.h) gegenüber Headern plus Implementierung (.h + .cpp)?

Als unerfahrener C++-Programmierer habe ich meine Klassenschnittstelle immer in .h Dateien und Implementierung in .cpp Dateien. Allerdings habe ich vor kurzem versucht, C # für eine Weile und ich wirklich wie seine saubere Syntax und die Art und Weise zu organisieren Dateien, insbesondere gibt es keine Unterscheidung zwischen Header und Implementierung, Sie in der Regel eine Klasse für jeden implementieren .cs Datei und Sie brauchen keine Kopfzeilen.

Ich weiß, dass dies in C++ auch möglich ist (Sie können "Inline"-Funktionen in .h Dateien), aber bis jetzt habe ich immer eine klare Unterscheidung gesehen zwischen .h y .cpp Dateien in C++-Projekten. Was sind die Vor- und Nachteile dieses Ansatzes?

Dankeschön

10voto

wheaties Punkte 34965

Es gibt einige Möglichkeiten, die Trennung der beiden in C++ zu nutzen. Erstens, wenn Sie eine Bibliothek aktualisieren möchten, ohne eine Schnittstelle zu ändern, dann bedeutet der Code in der C++-Datei, dass Sie einfach die Bibliothek aktualisieren können, anstatt die Bibliothek plus die Header. Zweitens versteckt es die Implementierung. Das heißt, es zwingt die Leute, Ihre Klasse nur im Hinblick auf die Schnittstelle zu betrachten, also das, was sie interessieren sollte, wenn der Code gut geschrieben ist. Schließlich bringt diese Trennung von Schnittstelle und Dokumentation eine gewisse ästhetische Sauberkeit mit sich. Daran muss man sich erst einmal gewöhnen, aber nach einer Weile fühlt es sich natürlich an (Meinung.)

5voto

dripfeed Punkte 387

Vergessen Sie die Bauzeiten nicht.

Die Aufnahme von Implementierungscode in Header-Dateien erhöht die Wahrscheinlichkeit, dass sie geändert werden. Und wenn Header-Dateien geändert werden, müssen alle CPP-Dateien, die sie enthalten, neu erstellt werden, was wiederum die Erstellungszeit verlängert. Dies kann bei größeren Projekten erheblich sein.

Ich bin auch ein Fan davon, die Implementierung vor den Benutzern meiner Bibliotheken geheim zu halten. Leider funktioniert das bei Vorlagenklassen nicht.

Meine Faustregel: Deklarationen in .H-Dateien, Definitionen in .CPP-Dateien.

2voto

Pyjong Punkte 2927

Es ist cooler, die Symbole an einem Ort für den Fall definiert haben, Sie wollten C++ mit bereits kompilierten Binärdateien (typischerweise bei der Verwendung einer Bibliothek) zu verbinden. stellen Sie sich vor, Sie müssen externe Symbole für globale Sachen in Ihre Binärdateien zu definieren. wenn Sie .cpp und .h-Code in der gleichen Datei hatten, müssten Sie die Symbole für Ihre Binärdateien für jede solche Datei zu definieren. in zwei Dateien Weg, den Sie nur die eine .h mit Definitionen für Binärdateien und eine Menge von .cpp-Dateien, die es verwenden haben könnte.

1voto

Jack Punkte 128223

Der Hauptunterschied besteht darin, dass etwas, das innerhalb einer .h Datei wird in jede Kompiliereinheit eingefügt, die diesen Header enthält, was zu Redundanz während der Kompilierphase führt in der endgültigen ausführbaren Binärdatei beim Splitten mit .h y .cpp kompiliert sie in eine einzige Objektdatei, die später mit den anderen Objektdateien gelinkt wird, indem nur ein kompilierter Binärcode vorhanden ist, der diese Header-Datei implementiert.

Wenn Sie außerdem Dinge nur innerhalb einer .h können Sie keine Variablen und Strukturen zwischen mehreren anderen .cpp Dateien.

1voto

Buggieboy Punkte 4438

Es ist interessant festzustellen, dass C# in letzter Zeit mit der Einführung von partiellen Klassen in gewissem Maße in die Richtung von C/C++ zu gehen scheint.

Der besondere Vorteil dieser Vorgehensweise in der IDE besteht darin, dass der Visual Studio-Designer den Teil der Klasse, der sich mit visuellen Steuerelementen oder Datenelementen und deren Layout befasst, ändern kann, ohne sich Gedanken darüber zu machen, dass die Methoden (Anwendungslogik), die sich in einer separaten Datei befinden, durcheinander gebracht werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X