Wo soll struct nur als private Membervariable definiert werden?

8

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.

%Vor%

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 ?

%Vor%     
schumacher574 24.08.2016, 17:02
quelle

3 Antworten

8

Für die Option 2 zum Kompilieren sollte _bar ein Zeiger sein. Option 3 ist am besten, da sie den Namensraum nicht verschmutzt.

    
SergeyA 24.08.2016, 17:04
quelle
4
  

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 damit.

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:

%Vor%     
πάντα ῥεῖ 24.08.2016 17:06
quelle
3
  

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:

%Vor%

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: Ссылка .

    
Arnav Borborah 24.08.2016 17:14
quelle

Tags und Links