Zugriff auf privaten Konstruktor ohne Freunde gewähren?

8

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.

    
user463035818 29.03.2017, 06:52
quelle

3 Antworten

9

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.

    
StoryTeller 29.03.2017, 06:59
quelle
5

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 :

%Vor%

Das erreicht nicht genau das, was du willst, aber es macht Freundschaft viel gezielter.

    
dasblinkenlight 29.03.2017 07:05
quelle
3

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.

%Vor%

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.

    
Galik 29.03.2017 08:13
quelle

Tags und Links