OVH Cloud OVH Cloud

friend

19 réponses
Avatar
Yalbrieux
Bonjour,

J'ouvre un autre fil car il me semble sortir de la question de David Romand
sur ==.

Les remarques de Benoît Dejean m'intéressent.
Perso je n'ai jamais ressenti le besoin, ni donc utilisé, friend.

Quelqu'un pourrait-il me donner un exemple incontournable de friend
nécessaire ?

Yves

9 réponses

1 2
Avatar
Fabien LE LEZ
On Tue, 21 Oct 2003 20:42:41 +0200, "Christophe Lephay"
wrote:

Non, car tout ce qui a été fait depuis l'assembleur peut être vu comme des
dispositions de confort...


Y compris l'assembleur, d'ailleurs ;-)

--
http://www.giromini.org/usenet-fr/repondre.html

Avatar
Christophe Lephay
Christophe Lephay wrote:
Yalbrieux wrote:
Est-ce que je pourrais résumer en disant finalement que friend est
une disposition de ''confort '', non pas incontournable mais bien
utile ?


Non, car tout ce qui a été fait depuis l'assembleur peut être vu
comme des dispositions de confort...


Pour être un peu plus clair, le fait de mettre quelque chose (fonction,
classe) friend ou pas est une décision importante en terme de conception,
qui peut avoir un impact majeur sur la façon dont les différentes
hiérarchies coopèrent entre elles. C'est donc une erreur de le concevoir
comme un compromis de confort du point de vue d'une certaine idéologie
objet.

Chris


Avatar
Michel Michaud
Dans news:bn28fn$7gt$, Christophe
Des exemples de fonctions libres friend, notemment, tu en as dès
qu'une classe doit pouvoir être utilisée avec les flux. Et dans ces
cas précis, friend est incontournable si on veut en conserver une
utilisation naturelle (au sens habituelle).


Vraiment ? Pourquoi tu n'aimes pas l'idiome classique qui permet en
plus le polymorphisme :

class ClBase
{
...
// Publique :
virtual void EcrireSur(ostream &); // = 0 le cas échéant...
};

ostream operator<<(ostream & s, const ClBase& o) // Pas friend !
{
o.EcrireSur(s);
return s;
}


ClBase& o= ...
ClBase* p= ...

cout << o << *p << ...

Il doit y avoir quelque chose qui m'échappe dans ton argument (encore
une fois, tu as raison, et friend est nécessaire, si on ne veut pas
ajouter la fonction membre publique à l'interface de la classe).

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Jean-Marc Bourguet
"Yalbrieux" writes:

Est-ce que je pourrais résumer en disant finalement que friend est une
disposition de ''confort '', non pas incontournable mais bien utile ?


Rien n'est incontournable. L'interet de pas mal de structures
syntaxiques est qu'elles permettent d'exprimer l'intention en meme
temps que l'effet. Entre rendre tout les membres publics et declarer
une fonction friend, l'effet va etre le meme, l'intention est beaucoup
plus clair dans le second cas.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Christophe Lephay
Michel Michaud wrote:
Dans news:bn28fn$7gt$, Christophe
Des exemples de fonctions libres friend, notemment, tu en as dès
qu'une classe doit pouvoir être utilisée avec les flux. Et dans ces
cas précis, friend est incontournable si on veut en conserver une
utilisation naturelle (au sens habituelle).


Vraiment ? Pourquoi tu n'aimes pas l'idiome classique qui permet en
plus le polymorphisme :


Mais si, je l'aime cet idiôme...

Il doit y avoir quelque chose qui m'échappe dans ton argument (encore
une fois, tu as raison, et friend est nécessaire, si on ne veut pas
ajouter la fonction membre publique à l'interface de la classe).


J'avais en tête de la mettre protected, c'est pour celà que je parlais
d'utilisation habituelle : dans le sens où EcrireSur( os ); n'est pas une
"utilisation habituelle" des flux. Mais c'est vrai que la mettre public
permet tout autant os << objet;

Chris


Avatar
Yalbrieux
OK.
Je suis moins bête ce soir.
Merci à tous
Yves
Avatar
Alexandre
"Yalbrieux" a écrit dans le message de
news:bn15sk$5qb$
Bonsoir,
Merci pour cet avis. Je ne vois toujours pas d'exemple incontournable et
il

me semble effectivement que friend n'est pas une disposition claire. Pour
tout vous dire ça me semble à moi, pauvre codeur bas de gamme, du
bricolage.

Donc oui, j'en veux encore car il y a sûrement une raison.
Yves

je ne crois pas que friend soit incontournable. Mais après tout, l'héritage

ne l'est pas non plus ;-)

Un exemple où friend est interessant (pour une classe) :
Tu crées une liste générique (bon, y'en a une en STL, mais c'est pour
l'exemple).
Tu as besoin d'une classe élément qui contient la valeur à stocker mais
également l'adresse de l'élément suivant.
Cette classe n'a besoin d'être utilisée que par la liste.
Donc tu peux tout mettre privé dedans, et déclarer la liste comme amie.
template <class Elt>
class EltListe
{
Elt Valeur;
EltListe *Suivant;
EltListe(const Elt& V):Valeur(V){}
friend class Liste<Elt>;
};

template <class Elt>
class Liste
{
EltListe *pPremier;
etc...
};

bon, on pourrait mettre EltListe DANS liste, on pourrait mettre le
constructeur public et espérer que personne ne l'appelle, il y a plein de
solutions.
Friend en permet une élégante, à mon avis.

Deuxième exemple : la définition d'opérateurs.
Si tu veux un opérateur (genre +) parfaitement commutatif, il sera + utile
comme fonction amie que comme membre.

etc...

Avatar
Alexandre
"Fabien LE LEZ" a écrit dans le message de
news:
On Tue, 21 Oct 2003 20:42:41 +0200, "Christophe Lephay"
wrote:

Non, car tout ce qui a été fait depuis l'assembleur peut être vu comme
des


dispositions de confort...


Y compris l'assembleur, d'ailleurs ;-)

--
ben oui, y' a ka coder avec des fils qui se branchent...

Qqn regrette cette époque ?? ;-)


Avatar
Fabien LE LEZ
On Sat, 25 Oct 2003 20:47:05 +0200, "Alexandre"
wrote:

on pourrait mettre le
constructeur public

et espérer que personne ne l'appelle


Pourquoi ? Je peux très bien trouver une autre utilisation pour cette
classe, et l'utiliser indépendamment de la classe Liste -- ce qui ne
casserait en rien l'encapsulation de Liste.

--
;-)

1 2