Wo soll ich diese "private" Hilfsfunktion implementieren?

8

Meine Klassendefinition ist über Kopf- und Quelldateien verteilt:

%Vor%

Wenn T::foo eine Hilfsfunktion verwenden muss, die sichtbar sein muss nur für T , welche der folgenden Lösungen ist die beste?

1. Privates Mitglied

%Vor%

2. Freie Funktion, auf die nur in der Klassen-Definitions-TU zugegriffen werden kann

%Vor%

Gibt es einen Unterschied, außer dass ich mit dem ersten mehr Funktionen in der Header-Datei habe?

    
NoSenseEtAl 05.01.2012, 17:26
quelle

4 Antworten

7

Bevorzugen Sie freie, nicht-friendly-Funktionen über Member-Funktionen, da diese weniger Zugriff auf die Klassenmitglieder als auf die Member-Funktionen haben und daher weniger Gelegenheit haben, Bugs einzuführen.

Wenn die Funktion vollständig außerhalb des Schnittstellenbereichs liegt, wird sie auch in einen unbenannten Namespace in der Implementierungsdatei eingefügt. Dies verringert die Wahrscheinlichkeit von Fehlern noch weiter, da andere Übersetzungseinheiten die Funktion nicht aufrufen können.

Ein weiterer Vorteil, den Sie mit einem Nicht-Freund in einem unbenannten Namespace haben, ist, dass es weniger eine Chance gibt, den Header zu ändern (da es eine Entity weniger gibt). Das Ändern einer Header-Datei verlangsamt aufgrund der Abhängigkeiten bei der Kompilierung oft die Build-Zeiten erheblich. Privat oder nicht, Sie werden wahrscheinlich eine Anzahl von Übersetzungseinheiten haben, die in Bezug auf die Kompilierung auf alles in der Kopfzeile angewiesen sind.

    
wilhelmtell 05.01.2012, 17:34
quelle
5

Kostenlose Funktionen, die Zugriff auf private Mitglieder benötigen, würden sowieso Friend-Deklarationen in der Kopfzeile benötigen, daher sind sie wahrscheinlich nicht besser als private Member-Funktionen.

Funktionen, die keinen privaten Zugriff benötigen, sollten freie Funktionen sein, unabhängig davon, ob sie im Header deklariert sind oder nicht.

Wenn Sie also Zugang zu privaten Mitgliedern benötigen, dann machen Sie sie zu Mitgliedern. Ansonsten mache sie freie Funktionen.

Scott Meyers hat diesen Algorithmus, um zu entscheiden, ob eine Funktion f, die sich auf eine Klasse C bezieht, ein Mitglied, ein Freund, ein Nichtmitglied oder ein Nichtmitglied sein sollte:

Ссылка

%Vor%
    
bames53 05.01.2012 17:38
quelle
1

Soweit ich das beurteilen kann, haben Sie es ziemlich gut verstanden. Es gibt keinen Unterschied außer Ihrer Header-Datei wird unnötig wachsen. Sie können jedoch auch einige Implementierungsdetails in der API Ihrer Klasse verlieren.

    
quelle
1

Ja, es gibt einen Unterschied

Wenn die Funktionen keine Teile der Klasse sind, wäre es besser, wenn sie nicht an diese bestimmte Klasse gebunden sind:

  • Es gibt eine Wahrscheinlichkeit, dass Sie sie in einer anderen Klasse verwenden möchten. In diesem Fall ist es sehr einfach, sie an einen gemeinsamen Ort zu verschieben und in beiden Klassen zu verwenden

  • Wenn die Funktion (die eine freie sein könnte) eine Klasse von Drittanbietern als Parameter verwendet und wenn Sie sie zu einer Memberfunktion machen, müssen Sie entweder eine andere .h-Datei (die diese Klassendefinition hat) oder deklarieren Diese Klasse in Ihrer .h-Datei. das bedeutet mehr Kopplung, was schlecht ist:)

Ich würde es also vorziehen, sie als freie zu schreiben (vielleicht in .cpp Datei im unbenannten Namensraum, wenn sie nicht (und wahrscheinlich nicht) in anderen Klassen verwendet werden)

    
Alek86 05.01.2012 17:57
quelle

Tags und Links