Nehmen Sie das folgende Headerdateibeispiel, wobei Bar eine Struktur ist:
%Vor% Ich möchte nur Bar
als private Membervariable für Foo
verfügbar machen. Was ist der richtige Weg, Bar
zu deklarieren und zu definieren?
Option 1: Definieren Sie im Header?
Ich möchte das vermeiden, da ich Bar
außerhalb des Bereichs Foo
class nicht verwenden möchte.
Option 2: Vorwärts deklarieren im Header, definieren in cpp?
Nicht sicher, ob dies legal ist, wie wird der Compiler die Größe von Foo
genau aus der Kopfzeile wissen, wenn die Definition von Bar
nicht direkt verfügbar ist? Verdeckt dies Bar
auch vor anderen Dateien, die den Header enthalten?
Kopfzeile:
%Vor%Implementierungsdatei:
%Vor%Option 3: innerhalb der Klasse deklarieren
Vielleicht die beste Option, um Umfang zu begrenzen, aber möglicherweise unordentlich ?
Option 3: innerhalb der Klasse deklarieren
Vielleicht die beste Option, um den Umfang zu begrenzen
Das ist natürlich der beste Weg, um den Umfang zu begrenzen und den Namensraum nicht zu verschmutzen. Wählen Sie Option 3.
aber möglicherweise chaotisch?
Ich habe Ihre Bedenken nicht bekommen (Sie könnten das in Ihrer Frage näher ausführen), da ist nichts
Hinweis: Wenn erforderlich, um von Clients damit einen Roundtrip durchzuführen, können sie das auto
-Schlüsselwort verwenden, um auf Bar
-Variablen zu verweisen.
Eine andere Option als erwähnt von R.Sahu , ist die Pimpl Idiom :
%Vor% Und in Foo
's Übersetzungseinheit:
Option 1: Definieren Sie im Header?
Ich möchte das vermeiden, da ich nicht möchte, dass Bar außerhalb des Foo-Klassenbereichs verwendbar ist.
Mit Option eins haben Sie gerade Ihre eigene Frage beantwortet.
Option 2: Vorwärts deklarieren im Header, definieren in cpp
Gleiches Problem wie Option 1 (Sichtbarkeit des Scopes), aber der einzige Vorteil ist, dass die Implementierung von Bar für andere .cpp
-Dateien nicht sichtbar ist.
Option 3: innerhalb der Klasse deklarieren
Option 3 ist die beste Lösung, da sie den von Ihnen gewünschten Zweck erfüllt und nur das. Außerdem steht Bar
für die gesamte Klasse zur Verfügung. Außerdem verhindert das Verschachteln der Klasse unnötige Unordnung in Ihrem Code, da nichts außer Foo
auf Bar
zugreifen kann. Und es scheint definitiv nicht unordentlich, und plus, Sie könnten nur die Struktur wie folgt deklarieren:
Für eine kleine Klasse, und das scheint in Ordnung zu sein, da es ein 1-Liner ist. Ein Nachteil wäre, die Klasse nach vorne zu deklarieren, nicht möglich, wie in dieser Antwort zu sehen ist: Ссылка .
Tags und Links c++