À quoi sert le mot-clé «ami»?

11

Pouvez-vous m'expliquer pourquoi le friendmot-clé est préféré pour donner des droits d'accès aux données privées de la classe?

Dalton
la source
1
Si vous demandez pourquoi a friendété préféré, quelles autres façons utilisez-vous habituellement pour accéder aux données de cours privés de l'extérieur?
Benjamin Bannier
@honk "Preferred" n'est peut-être pas le bon mot à utiliser ici. J'ai édité la plupart des articles pour corriger la grammaire et ainsi de suite et j'ai conservé le choix du mot d'origine, mais je pense qu'il peut y avoir une barrière linguistique ici.
Adam Lear
Je ne sais pas parce que j'ai lu un ami aujourd'hui par hasard. et l'article dit que si je n'utilise pas d'amis, je vais créer une classe monolit.
Dalton

Réponses:

17

Friend est la manière classique d'étendre l'interface d'une classe.
Mais la grande chose est que cet ami documente explicitement votre intention de lier étroitement des éléments spécifiques à une classe.

Remarque: En utilisant un ami, vous liez étroitement les amis à la classe.

Un exemple parfait est les opérateurs de flux en C ++

class Plop
{
    private:
        int  value;
        friend std::ostream& operator<<(std::ostream& stream, Plop const& data);
        friend std::istream& operator>>(std::istream& stream, Plop&       data);
};

std::ostream& operator<<(std::ostream& stream, Plop const& data)
{
     return stream << data.value << " ";
}
std::istream& operator>>(std::istream& stream, Plop&       data)
{
     return stream >> data.value;
}

Ici, nous étendons l'interface publique de la classe Plop d'une manière qui nous permet de diffuser l'objet dans et hors d'un flux, mais sans exposer l'implémentation interne ni provoquer de futurs maux de tête d'implémentation en exigeant l'utilisation de méthodes get / set qui doivent être maintenus (car ils feraient partie de l'interface publique) même si l'implémentation interne est modifiée.

Remarque: Cela ne rompt PAS l' encapsulation, mais il lie étroitement les opérateurs de flux à l'implémentation de la classe Plop (c'est-à-dire que toute modification de l'implémentation de la classe Plop nécessitera une modification de l'implémentation des opérateurs de flux). Mais cela est attendu. Toutes les parties de l'interface publique (y compris les méthodes publiques / protégées) sont étroitement liées à l'implémentation.

Mais Remarque: Vous avez explicitement documenté cette liaison dans le cadre de la déclaration de classe.

Remarque: je ne ferais pas référence à un ami comme moyen préféré d'exposer des données privées. La surutilisation d'un ami peut être aussi mauvaise que d'exposer la mise en œuvre. Comme toutes les fonctionnalités du langage, il doit être utilisé judicieusement.

Martin York
la source
Si vous pouviez accéder publiquement aux données (par exemple via un getter), auriez-vous plutôt utilisé une fonction gratuite?
Ioanna