EDWARD SZABELSKI

Exemple de déclaration d`amitié

Dans l`exemple ci-dessus, les fonctions membres de YourClass ne peuvent pas accéder aux membres privés de YourOtherClass. Il n`est pas affecté par les mots clés de contrôle d`accès. Si un membre d`un modèle de classe A est déclaré être un ami d`une classe non-template B, le membre correspondant de chaque spécialisation de A devient un ami de B. Friends ne sont pas dans la portée de la classe et ils ne sont pas appelés à l`aide des opérateurs de sélection de membres (. Lorsqu`une déclaration Friend fait référence à une spécialisation complète d`un modèle de fonction, le mot clé inline et les arguments par défaut ne peuvent pas être utilisés. Par conséquent, la déclaration Friend dans la classe HasFriends génère une erreur. Pour déclarer deux classes qui sont des amis les uns des autres, la deuxième classe entière doit être spécifiée comme un ami de la première classe. L`exemple suivant montre une classe point et une fonction friend, ChangePrivate. Les fonctions Friend peuvent être définies dans des déclarations de classe. Les modèles imbriqués doivent avoir des noms de paramètres de modèle différents. Les fonctions Friend définies dans les déclarations de classe ne sont pas prises en compte dans la portée de la classe englobante; ils sont dans la portée du fichier. Pour plus d`informations, consultez extern.

Dans l`exemple précédent, seule la fonction A:: Func1 (B &) bénéficie d`un accès ami à la classe B. Dans votre cas, la barre de classe ami; devrait suffire. L`amitié n`est pas mutuelle sauf si elle est explicitement spécifiée en tant que telle. Les spécificateurs de classe de stockage ne sont pas autorisés dans les déclarations de fonction friend. Seul l`implémenteur de classe peut déclarer qui sont ses amis. La figure suivante montre quatre déclarations de classe: base, Derived, aFriend et anotherFriend. Si vous déclarez une fonction friend qui n`a pas été déclarée précédemment, cette fonction est exportée vers la portée non classe englobante. L`amitié n`est pas héritée, ce qui signifie que les classes dérivées de YourOtherClass ne peuvent pas accéder aux membres privés de YourClass.

Dans le modèle Friend struct Foo; vous ne devez pas écrire t après TypeName/Class sinon il provoquera une erreur d`occultation de modèle param. Le second formulaire n`introduit pas une nouvelle classe; Il peut être utilisé lorsque la classe a déjà été déclarée et doit être utilisée lors de la déclaration d`un paramètre de type de modèle ou d`un typedef comme ami. Cela semble fonctionner; Cependant, j`ai des questions sur ce qui se passe en dessous. Les arguments de modèle par défaut sont autorisés uniquement sur les déclarations d`ami de modèle si la déclaration est une définition et aucune autre déclaration de ce modèle de fonction n`apparaît dans cette unité de traduction. Avant C++ 11, les déclarations de membre et les définitions à l`intérieur de la classe imbriquée de l`ami de la classe T ne peuvent pas accéder aux membres privés et protégés de la classe T, mais certains compilateurs l`acceptent même en mode pré-C + + 11. N`est pas autorisé car les paramètres de modèle ne peuvent pas s`occulter.