Pourquoi est-ce que C++ ont public
membres que n'importe qui peut l'appeler et friend
des déclarations qui exposent tous private
membres de donnée étrangères des classes ou des méthodes, mais n'offrent aucune syntaxe pour exposer membres en particulier étant donné que les appelants?
Je tiens à exprimer interfaces avec quelques routines être invoquée que par les appelants, sans avoir à donner aux appelants de l'accès complet à tous les soldats, qui se sent comme une chose raisonnable de vouloir. Le mieux que je pouvais venir avec moi-même (ci-dessous) et des suggestions faites par d'autres jusqu'à présent tournent autour des idiomes/motif de différentes indirectness, où vraiment, je veux juste un moyen d'avoir unique, simple définitions de classes d'indiquer explicitement que les appelants (plus granulaire que moi, mes enfants, ou absolument tout le monde) peut accéder à laquelle les membres. Quelle est la meilleure façon d'exprimer le concept ci-dessous?
// Can I grant Y::usesX(...) selective X::restricted(...) access more cleanly?
void Y::usesX(int n, X *x, int m) {
X::AttorneyY::restricted(*x, n);
}
struct X {
class AttorneyY; // Proxies restricted state to part or all of Y.
private:
void restricted(int); // Something preferably selectively available.
friend class AttorneyY; // Give trusted member class private access.
int personal_; // Truly private state ...
};
// Single abstract permission. Can add more friends or forwards.
class X::AttorneyY {
friend void Y::usesX(int, X *, int);
inline static void restricted(X &x, int n) { x.restricted(n); }
};
Je suis loin d'être un logiciel organisation de gourou, mais il se sent comme la simplicité de l'interface et le principe de moindre privilège vont directement à l'encontre de cet aspect de la langue. Une meilleure exemple pour mon désir peut être un Person
classe déclarée méthodes comme takePill(Medicine *)
tellTheTruth()
et forfeitDollars(unsigned int)
que seulement Physician
, Judge
ou TaxMan
instances/méthodes membres, respectivement, devraient même songer à invoquer. Ayant besoin d'un temps de proxy ou de classes d'interface pour chaque aspect de l'interface se trouve mal avec moi, mais merci de le dire si vous le savez je suis en manque de quelque chose.
Réponse acceptée à partir de Drew Hall: Dr Dobbs, l'Amitié et le Procureur-Client Idiome
Le code ci-dessus à l'origine appelé la classe wrapper "Proxy" au lieu de "Procureur" et utilise des pointeurs au lieu de références, mais autrement a été équivalent à ce qui a Attiré trouvé, que j'ai ensuite considéré comme le meilleur en général de solution connue. (Ne pas tapoter sur le dos trop dur...) j'ai aussi changé la signature de "limité" pour démontrer paramètre de transfert. Le coût global de cet idiome est une classe et un ami de la déclaration par l'ensemble d'autorisations, un ami de la déclaration par ensemble approuvé de l'appelant, et un transfert wrapper par méthode exposée par le jeu d'autorisations. La plupart des meilleurs de la discussion ci-dessous tourne autour du renvoi d'appel standard qui est très semblable 'Clé' idiome évite au détriment de moins de protection directe.