Ich arbeite an einem Code, wo ich auf eine ähnliche Situation gestoßen bin:
%Vor% Ich würde es vorziehen, Bar
nicht als friend
von Foo
zu haben, da neben Foo
s der Konstruktor Bar
keinen Zugang zu irgendwelchen Foo
s privaten Methoden benötigt (und somit nicht haben sollte) Zugriff). Gibt es eine Möglichkeit, nur Bar
zu erlauben, Foo
s zu erstellen, ohne sie zu Freunden zu machen?
PS : Ich habe festgestellt, dass die Frage nicht zu 100% klar ist. Es macht mir nichts aus, ob es über Freunde ist oder nicht, nur die Tatsache, dass alle Bar
Zugang zu allen privaten Methoden hat, stört mich (was normalerweise bei friends
der Fall ist) und das ist, was ich vermeiden möchte. Glücklicherweise hatte keine der bisher gegebenen Antworten ein Problem mit dieser miesen Formulierung.
Genau das ist das Anwalt-Klient Idiom für:
> %Vor%In einem Code, der die Mode des Lebens imitiert, erklärt die Klasse einen Anwalt, der die Geheimnisse vermittelt, die er mit den ausgewählten Parteien teilen will.
Wenn du keine andere Klasse einführen willst, kannst du den Freundschaftskreis verkleinern und Bar
's Freund des Konstruktors Foo
machen. Es erfordert die Bar
-Definition, um für Foo
verfügbar zu sein, und der% constructor von Bar
hat weiterhin uneingeschränkten Zugriff auf die private Implementierung von Foo
:
Das erreicht nicht genau das, was du willst, aber es macht Freundschaft viel gezielter.
Eine Möglichkeit, die mir einfällt, ist ein internes class
, das Bar
zu seinem Freund macht, so dass nur Bar
es erstellen kann und das interne class
als zusätzlicher Parameter zu Foo
constructor verwendet werden kann also können nur die Freunde von class
es aufrufen.
Neben der Einschränkung des Zugriffs auf bestimmte Funktionen ermöglicht diese Technik auch die Verwendung von Smart Pointer make
Funktionen, die Freundschaft nicht leitet.
Tags und Links c++ constructor friend private