Können wir in C ++ bei einer Memberfunktion in Klasse A den Zugriff auf Klasse B beschränken, ohne B den vollen Zugriff von Freunden auf A zu geben? [Duplikat]

8

Ich habe das ein paar Mal gewollt und war nicht in der Lage, einen anständigen Weg zu finden, es zu tun.

Sagen wir, ich habe eine Memberfunktion in Klasse A. Ich möchte diese Funktion von einer nicht verwandten Klasse B aufrufen können, aber nicht allgemein aufrufbar sein. Sie könnten sagen: "Sicher, machen Sie die Funktion privat und erklären Sie B zu einem Freund von A." Das habe ich gemacht, aber es scheint ein bisschen übertrieben zu sein. Ich möchte B nicht wirklich Zugriff auf alles in A geben, nur die eine Funktion.

Kurz gesagt: A::func() nur durch Klasse B aufrufbar, aber B nicht als Freund von A. erklärt. Möglich?

    
Kurt Hutchinson 19.07.2010, 16:02
quelle

2 Antworten

5

Sie könnten die Schnittstelle von A in mehrere reine abstrakte Basisklassen aufteilen und dann B einen Verweis auf die Schnittstelle mit der entsprechenden Methode geben. Andere Klassen würden nur Schnittstellen erhalten, die diese Methode nicht enthalten. Beachten Sie, dass dies nicht sehr skalierbar ist, da die Anzahl der Schnittstellen schnell sehr groß werden kann.

    
Björn Pollex 19.07.2010 16:05
quelle
5

Eine mögliche Methode besteht darin, eine vertrauenswürdige Klasse zu erstellen, die A::func umschließt und ein Wrapper-Objekt an B übergibt. Dies erfordert wiederum, dass der Wrapper ein Freund von A ist, aber Sie müssen nur eine solche Klasse verwalten, während alle externen Klassen den Wrapper verwenden können.

Beispiel:

%Vor%     
casablanca 19.07.2010 16:10
quelle

Tags und Links