Private Variablen sind eine Möglichkeit, die Komplexität und Implementierungsdetails für den Benutzer einer Klasse zu verbergen. Dies ist ein ziemlich schönes Feature. Aber ich verstehe nicht, warum wir sie in c ++ in den Header einer Klasse schreiben müssen. Ich sehe zwei ärgerliche Nachteile:
- Der Header des Benutzers wird unübersichtlich
- Es erzwingt eine Neukompilierung aller Client-Bibliotheken, wenn die Interna geändert werden
Gibt es einen konzeptionellen Grund für diese Anforderung? Ist es nur, um dem Compiler die Arbeit zu erleichtern?
struct foo{};
) ist nicht erlaubt, forward declarations (struct foo;
) jedoch.Antworten:
Dies liegt daran, dass der C ++ - Compiler die tatsächliche Größe der Klasse kennen muss, um bei der Instanziierung die richtige Speichermenge zuzuweisen. Und die Größe umfasst alle Mitglieder, auch private.
Eine Möglichkeit, dies zu vermeiden, ist die Verwendung des Pimpl-Idioms , das Herb Sutter in seinen Guru of the Week-Serien Nr. 24 und Nr. 28 erklärt hat .
Aktualisieren
Tatsächlich ist dies (oder allgemeiner die Unterscheidung zwischen Header- und Quelldatei und
#include
s) eine große Hürde in C ++, die von C geerbt wurde. In den Tagen, in denenC ++C erstellt wurde, gab es noch keine Erfahrung mit umfangreicher Softwareentwicklung, in denen dies der Fall war fängt an, echte Probleme zu verursachen. Die Lektionen, die seitdem gelernt wurden, wurden von Designern neuerer Sprachen beachtet, aber C ++ ist an Abwärtskompatibilitätsanforderungen gebunden, was es wirklich schwierig macht, ein derart grundlegendes Problem in der Sprache anzugehen.quelle
private
ist jedoch moderner.Die Klassendefinition muss ausreichen, damit der Compiler überall dort, wo Sie ein Objekt der Klasse verwendet haben, ein identisches Layout im Speicher erzeugt. Zum Beispiel mit etwas wie:
Der Compiler hat normalerweise den
a
Offset 0 und denb
Offset4
. Wenn der Compiler dies als einfach ansah:Es würde "denken", dass
b
der Offset 0 anstelle von Offset 4 sein sollte. Wenn Code, der diese zugewieseneb
Definition verwendeta
, geändert wird, wird Code, der die erste Definition verwendet , geändert und umgekehrt.Der übliche Weg, um die Auswirkungen von Änderungen an den privaten Teilen der Klasse zu minimieren, wird normalerweise als Pimpl-Idiom bezeichnet (über das Google sicher viele Informationen geben kann).
quelle
Es gibt höchstwahrscheinlich mehrere Gründe. Auf private Mitglieder können die meisten anderen Klassen nicht zugreifen, auf sie können jedoch weiterhin Freundesklassen zugreifen. Zumindest in diesem Fall werden sie möglicherweise in der Kopfzeile benötigt, damit die Friend-Klasse sehen kann, dass sie existieren.
Die Neukompilierung abhängiger Dateien hängt möglicherweise von Ihrer Include-Struktur ab. Das Einschließen der .h-Dateien in eine .cpp-Datei anstelle eines anderen Headers kann in einigen Fällen lange Ketten von Neukompilierungen verhindern.
quelle