38 votes

Quand utiliser la classe friend en C++

Duplicata possible :
Quand faut-il utiliser le terme "ami" en C++ ?

J'étais en train de réviser mes connaissances en C++ (je suis un développeur Java) et je suis tombé sur l'article suivant friend class mot-clé que j'avais oublié depuis un moment. S'agit-il d'une de ces fonctionnalités qui font partie de l'évier de cuisine, ou y a-t-il une bonne raison de faire cela plutôt qu'un simple getter vanille ? Je comprends la différence dans la mesure où cela limite les personnes qui peuvent accéder aux données, mais je ne vois pas de scénario où cela serait nécessaire.

Note : J'ai vu une question similaire, mais je demande spécifiquement si c'est juste une fonction avancée qui n'ajoute aucune valeur réelle, sauf pour embrouiller les gens qui regardent votre code jusqu'à ce qu'ils réalisent ce que vous faites ?

41voto

John D. Cook Points 19036

Je suis d'accord avec les commentaires qui disent que le mot-clé friend peut améliorer l'encapsulation s'il est utilisé à bon escient. J'ajouterais simplement que l'utilisation la plus courante (légitime !) des classes amies peut être le test. Vous pouvez vouloir qu'une classe de testeur ait un plus grand degré d'accès que les autres classes de clients. Une classe de testeur pourrait avoir une bonne raison de regarder les détails internes qui sont délibérément cachés aux autres classes.

19voto

James Thompson Points 15464

D'après mon expérience, les cas où friend (ou mutable, qui est un peu similaire) améliore réellement l'encapsulation des données sont rares par rapport à la fréquence à laquelle il est utilisé pour casser l'encapsulation.

Elle m'est rarement utile, mais quand je l'utilise, c'est pour des cas où j'ai dû diviser une classe qui était auparavant une classe unique en deux classes distinctes qui doivent accéder à des données/fonctionnalités communes.

Modifier pour répondre au commentaire de Outlaw Programmer : Nous sommes tout à fait d'accord sur ce point. Une autre option, à part l'utilisation de classes amies après les avoir divisées, est de rendre les accesseurs publics, ce qui brise parfois l'encapsulation ! Je pense que certaines personnes pensent que les classes amies brisent en quelque sorte l'encapsulation parce qu'elles l'ont souvent vu utilisé de manière incorrecte, et beaucoup de personnes ne voient probablement jamais de code où il a été utilisé correctement, parce que c'est une chose rare. J'aime votre façon de le dire - la convivialité est un bon moyen terme entre ne pas vous permettre de diviser votre classe et rendre TOUT accessible au public.

Editer pour répondre à David Thornley : Je suis d'accord que la flexibilité que C++ vous permet de faire des choses comme ça est le résultat des décisions de conception qui ont été prises dans C++. Je pense que c'est ce qui rend encore plus important de comprendre ce qui est généralement un bon et un mauvais style dans les langages flexibles. Le point de vue de Java est que vous ne devriez jamais avoir de classes amies afin que ces classes ne soient pas fournies, mais en tant que programmeurs C++, il est de notre responsabilité en tant que communauté de définir l'utilisation appropriée de ces constructions de langage très flexibles mais parfois mal utilisées.

Modifier pour répondre à Tom : Mutable ne casse pas nécessairement l'encapsulation, mais beaucoup d'utilisations du mot-clé mutable que j'ai vues dans des situations réelles cassent l'encapsulation, parce qu'il est beaucoup plus courant de voir des gens casser l'encapsulation avec mutable que de trouver et comprendre une utilisation correcte de mutable en premier lieu.

13voto

User Points 13983

Lorsque vous souhaitez qu'une classe (Factory) soit responsable de la création d'instances d'une autre classe (Type). Vous pouvez rendre le constructeur du Type privé et ainsi vous assurer que seule la Factory peut créer des objets Type. C'est utile lorsque vous souhaitez déléguer les contrôles à une autre classe qui pourrait servir de validateur. Un seul scénario d'utilisation.

P.S. Le mot-clé "friend" en C# me manque vraiment...

9voto

Rob K Points 3453

Un exemple concret serait une fabrique de classe, où vous voulez qu'une classe ne puisse être créée que par une autre classe de fabrique, donc vous rendez les constructeurs privés, et la classe de fabrique un ami de la classe produite.

C'est un peu comme une douille 2" 12 points 3/4" - pas très courante, mais quand on en a besoin, on est très content de l'avoir.

4voto

Nemanja Trifunovic Points 17239

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X