C ++, müssen private Funktionen wirklich in der Header-Datei sein?

8

Ich habe Header-Dateien immer als eine Art "öffentliche Schnittstelle" betrachtet, die eine Klasse beschreibt. In diesem Fall wäre es besser, private Felder und Funktionen in der cpp-Datei zu behalten.

Ich verstehe, dass private Felder in der Kopfzeile sein müssen, so dass andere Klassen sagen können, wie viel Speicher eine Instanz einer Klasse verbrauchen wird, aber es ist mir aufgefallen, als ich gerade eine private Hilfsfunktion schreiben wollte könnte statisch gemacht werden, in diesem Fall war es nicht notwendig, dass es überhaupt "Teil der Klasse" war, es könnte genauso einfach eine reguläre Funktion in der .cpp-Datei der Klassendefinition sein.

Es ist mir dann eingefallen, dass alle privaten Funktionen möglicherweise neu geschrieben werden können, um statisch zu sein, indem Sie Zeiger / Referenzen auf Klassenfelder akzeptieren, statt zu erwarten, dass sie definiert werden die Klasse.

Dies würde das Deklarieren privater Funktionen in der Header-Datei überflüssig machen.

Ich mag es, Konventionen zu befolgen. Jetzt möchte ich fragen, ob es eine etablierte Konvention in C ++ ist, dass nicht-statische private Funktionen sollten in der Kopfzeile sein sollten Datei? Was ist mit statischen Funktionen oder statischen Konstanten?

EDIT: Ich werde etwas Code eingeben, um zu erklären, worauf ich hinaus will:

.h-Datei:

%Vor%

.cpp-Datei

%Vor%

Beachten Sie, dass someHelper(int* x) in der cpp-Datei auf das private Element x verweist, jedoch nicht direkt, und daher nicht in der Kopfzeile angezeigt werden muss. Ich frage mich, ob so etwas als "schlechter Stil" angesehen wird.

    
Ghost314 05.02.2015, 01:01
quelle

2 Antworten

7

Ich stimme zu, dass es ein Problem ist, dass Implementierungsdetails in einer Header-Datei verfügbar gemacht werden müssen; es stört die Trennung von Schnittstelle und Implementierung.

Das Verschieben privater Hilfsfunktionen als freie Funktionen in der .cpp -Datei (ich vermute, dass Sie das mit "statisch" meinen) funktioniert nicht, wenn diese Funktionen auf private Membervariablen zugreifen müssen.

Vielleicht interessieren Sie sich für das pImpl idiom (more)

    
M.M 05.02.2015, 01:05
quelle
8

PImpl idiom wird nur benötigt

  1. wenn Sie private Member 'Variablen' aus dem öffentlichen Header entfernen müssen (um die Binärkompatibilität neuer Releases zu erhalten)
  2. Wenn dieses Design es einfacher macht zu verstehen

Wenn Sie nur private Member 'Funktionen' aus dem öffentlichen Header entfernen möchten, reicht die Verwendung einer inneren Klasse aus. Dies hat keine Umleitung Strafe wie PImpl Idiom.

öffentliche .h-Datei

%Vor%

in der .cpp-Datei

%Vor%

SomeClass::Private kann eine beliebige Anzahl von Hilfsfunktionen haben, die vollen Zugriff auf alle privaten / Freunde von SomeClass haben, ohne sie in der Header-Datei deklarieren zu müssen.

    
balki 26.02.2015 05:02
quelle

Tags und Links