In der Regel wird bei der Entwicklung von C ++ - Spielen die Geschwindigkeit gegenüber der Kapselung bewertet. Daher sehen Sie eine Menge öffentlich zugänglicher Klassenmitglieder, die eigentlich nicht öffentlich sein sollten.
Ich scheine in den meisten Fällen festzustellen, dass nur sehr wenige Klassen das Innenleben einer anderen Klasse wirklich kennen müssen, um ihre privaten Daten zu ändern oder zu lesen.
Das Erstellen öffentlicher Getter / Setter für diese privaten Daten enthüllt Dinge, die wirklich nicht ohne weiteres geändert werden sollten.
Wäre es hier ein Kompromiss, Freundesklassen zu verwenden? oder gibt es einen Nachteil bei Freundklassen, die ich nicht sehe?
quelle
Eine andere Option ist die Verwendung des PIMPL-Idioms , wobei ein Teil der Strukturimplementierung ein Zeiger auf einen anderen Typ ist. Die meisten Benutzer der Klasse enthalten nur die normale Header-Datei, wobei die Implementierung ein undurchsichtiger Zeiger ist. Klassen, die Zugriff auf die privaten Daten benötigen, können den Header enthalten, der den anderen Typ definiert, und die bereitgestellte Schnittstelle verwenden.
Dies ist ein gängiges Muster für C-Programmierer, die eine freundschaftliche Funktionalität wünschen. Meiner Meinung nach geht es auch eher darum, über die Trennung von Bedenken (ein allgemein gutes Entwurfsprinzip, das zu wiederverwendbarem, orthogonalem Code führt) als über die Kapselung (eine OO-spezifische Technik, die zur Implementierung der Trennung von Bedenken nützlich ist, aber auch häufig missbraucht wird) nachzudenken Dinge zu komplizieren).
Es hat gegenüber Freunden einen Vorteil, dass es den Freund überhaupt nicht mit dem Freund koppelt. Einige Leute könnten behaupten, dass dies ein Nachteil ist, da jetzt jeder Ihre Klasse "befreundet" haben kann. Ich denke, das ist eine ungerechtfertigte Angst, da Sie die Beziehung immer noch explizit machen (indem Sie den Header einfügen). Wenn Sie Angst davor haben, haben Sie Angst vor Ihrer (oder der Ihrer Mitarbeiter) Fähigkeit, kluge Architekturentscheidungen zu treffen. Aber wenn Sie diese Entscheidungen später nicht richtig treffen können, warum vertrauen Sie sich
friend
jetzt an?Es hat einen Nachteil der Laufzeitkosten. Wenn Sie die Daten in einem Zeiger speichern, haben Sie eine schlechtere Cache-Kohärenz und mehr Zuordnungszahlen. Außerdem benötigen Sie einen Destruktor, um sie zu bereinigen.
quelle