7
votes

Surcharge de l'opérateur de flux

Pourquoi la surcharge des opérateurs de flux (<<, >>) devrait-elle être conservée comme des amis plutôt que de leur faire des membres de la classe?


1 commentaires

Cela rend la programmation tellement plus excitante lorsque les fonctions ont une liaison avec les membres privés de vos classes.


3 Réponses :


0
votes

membres de quelle classe? Quel est le type de l'opérande de gauche?

Ils ne doivent pas nécessairement être ami , sauf s'il est nécessaire d'accéder à des données privées autrement inaccessibles.


0 commentaires

10
votes

Lorsque vous surchargez un opérateur binaire en tant que fonction de membre d'une classe, la surcharge est utilisée lorsque l'opérande premier est du type de classe.

Pour les opérateurs de flux, le premier opérande est le flux et non (généralement) la classe personnalisée.

Pour cette raison, des opérateurs de flux surchargés pour les classes personnalisées conçus pour être utilisés de manière conventionnelle ne peuvent pas être des fonctions membres de la classe personnalisée, elles doivent être des fonctions libres.

(Je suppose que les classes de flux ne sont pas ouvertes pour être modifiées; s'ils étaient, vous pouvez ajouter des fonctions de membre aux classes de flux pour faire face à des types personnalisés supplémentaires, mais cela serait généralement indésirable d'un point de vue de dépendance.)

Que ce soit ou non, ils sont amis devraient dépendre de leur accès à des membres non publics de la classe.


6 commentaires

Je pense que c'est un peu trompeur. Ils peuvent être des fonctions membres peuvent être membres, mais pour les utiliser de manière habituelle (écrire sur les flux), ils doivent être des fonctions membres.


@sztomi: Je ne comprends pas votre commentaire. Non, ils ne ont besoin des fonctions membres; Ils ne peuvent pas être des fonctions membres (sauf si vous écrivez une classe de flux ou d'écrire vos opérateurs de streaming à l'envers du reste du monde).


Donc oui, ils peuvent être des fonctions membres. Si vous voulez qu'ils travaillent comme d'habitude (comme le reste du mot l'utilisent), vous devez les définir comme amis. C'est ce que je voulais dire.


@sztomi: Je ne comprends toujours pas ce que tu veux dire. Vous n'êtes pas obligé de les déclarer comme des amis, c'est bien de les avoir en tant que fonctions libres de non-amis si elles peuvent effectuer une interface publique de la classe personnalisée.


Avant de vous éditer, vous répondez, il a déclaré qu'ils «doivent être» libres. Non, ils ne le font pas, seulement si vous voulez qu'ils travaillent de la manière habituelle. Je ne peux plus reformuler cela. Mais ce n'est vraiment pas un gros problème, alors oubliez ça :).


@sztomi: J'ai édité de la clarté; À l'origine, je suppose que la prémisse du paragraphe précédent: le premier opérande est le flux. Maintenant, j'ai fait cela explicite. Dans votre premier commentaire, vous avez dit: "... ils doivent être des fonctions membres"; Dans votre deuxième commentaire, vous avez dit que «si vous voulez qu'ils travaillent comme d'habitude ... vous devez les définir comme amis». Aucune de ces déclarations n'est vraie. Je suis désolé si ma réponse n'était pas claire à 100% mais je pense que c'est exact.



2
votes

Vous pouvez donc dire:

my_class << some_stream;


0 commentaires