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.