verwirrt über den eigentlichen Zweck der Header-Dateien in C ++ [Duplizieren]

9

Ich bekomme keine C ++ - Header-Dateien, aus zwei Gründen:

  1. Ich dachte, der Zweck von Header-Dateien sei im Allgemeinen die Trennung von Interface und Implementierung. Mit anderen Worten, der Client verwendet die Headerdatei, um zu lernen, wie die Klasse verwendet wird, muss sich aber nicht darum kümmern, wie die Klasse diese Funktionalität tatsächlich intern implementiert.

  2. Warum werden dann private Variablen einer C ++ - Klasse in ihrer Header-Datei angegeben?

Mir scheint, dass private Variablen in der Header-Datei die Trennung von Interface und Implementierung verletzen. Intuitiv würde ich denken, dass es sinnvoller wäre, wenn sich private Variablen in der Quelldatei befinden, da dies die Datei ist, die nicht der Außenwelt ausgesetzt ist.

Vielleicht habe ich nur den Zweck der Header-Dateien missverstanden, und 1. oben ist einfach völlig falsch? Auf welche Weise?

    
NoobOverflow 17.07.2012, 17:15
quelle

4 Antworten

10

C ++ unterscheidet zwischen Deklaration und Definition von Funktionen und Klassen. Im Allgemeinen enthält eine C ++ - Header-Datei die Deklaration einer Klasse. Da keine partiellen Deklarationen erlaubt sind, muss die Header-Datei die vollständige Klassendeklaration enthalten, einschließlich aller privaten Member (Variablen und Member-Funktionen).

Wenn Sie die vollständige Implementierung vor der Öffentlichkeit verbergen möchten, können Sie das pimpl idiom verwenden, um dies zu erreichen.

p>     
πάντα ῥεῖ 17.07.2012, 17:30
quelle
6

Der primäre Funktionszweck von C ++ - Header-Dateien besteht darin, dass in der C ++ - Sprache keine Modulimporte oder ähnliches vorhanden sind, die in anderen Sprachen existieren. Die einzige Möglichkeit für den Compiler, über Typen, Funktionen usw. aus anderen Dateien zu wissen, besteht darin, den Code mithilfe von #include in die aktuelle Quelldatei einzufügen.

Theoretisch könnten Sie auch Ihren gesamten Quellcode in die Kopfzeile einfügen und nur eine Quelldatei mit allen Headern haben. Der Grund, warum dies normalerweise nicht geschieht, ist zweifach. Erstens würde es länger dauern, um zu kompilieren (was bei einigen Projekten von Bedeutung ist), und jede Änderung an einer Datei würde zu einer vollständigen Neukompilierung des Projekts führen. Zweitens hilft die Implementierung der Implementierung in eine Quelldatei tatsächlich dabei, die Schnittstelle von der Implementierung zu trennen, selbst wenn ein Teil der Implementierung noch in der Header-Datei angegeben ist.

Beachten Sie, dass Inline-Methoden in Headern auch eine feine Linie von Implementierungsdetails enthalten, die den public / clients Ihrer Klasse ausgesetzt sind.

Wenn Sie wirklich die Schnittstelle vollständig von der Implementierung trennen wollen (was definitiv einen Vorteil hat), dann ist der C ++ Weg das Pimpl-Idiom zu benutzen. Mit diesem Idiom werden alle privaten Daten in der Quelldatei versteckt und nur eine abstrakte Schnittstelle für die Öffentlichkeit bereitgestellt. Darüber hinaus kann die Verwendung des Nicht-Virtuellen-Schnittstelle (NVI) -Musters helfen, Clients von Schnittstellenänderungen zu isolieren.

    
Mark B 17.07.2012 17:31
quelle
4

Der Zweck von Header-Dateien besteht darin, dem Compiler die Informationen zu geben, die er benötigt, um Definitionen zwischen Kompilierungseinheiten (.cpp-Quelldateien) zu teilen. Es ist eine mechanische Sache, keine philosophische Sache.

Zum Beispiel müssen private Member-Variablen deklariert werden, weil sie die Größe eines Objekts definieren, und der Compiler muss die Größe kennen, wenn er ein Objekt zuweist.

    
Mark Ransom 17.07.2012 17:35
quelle
0

In C / C ++ besteht ein Zweck von Headerdateien darin, mehreren Übersetzungseinheiten die Verwendung von Typen mit derselben Definition zu ermöglichen, ohne die Definition über mehrere Dateien hinweg zu duplizieren. Teil der Definition einer Klasse sind ihre privaten Mitglieder.

    
Eric Finn 17.07.2012 17:32
quelle

Tags und Links