IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

utilisation justifiée de "friend" ?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut utilisation justifiée de "friend" ?
    bonjour

    j'ai un code qui marche et j'aimerai comprendre pk il faut mettre friend :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    #include<iostream.h>
    #include<string.h>
     
    class matrice;
     
    class vect{
    	private:
    		double v[3];
    	public:
    		vect(double a=0, double b=0, double c=0)
    		{
    			v[0]=a;
    			v[1]=b;
    			v[2]=c;
    		}
     
    		void affichage(void)
    		{
    			cout<<"le vecteur a pour coordonnee: "<<v[0]<<" "<<v[1]<<" "<<v[2]<<"\n";
    		}
     
    		friend vect prod(vect,matrice);
    };
     
    class matrice
    {
    	private:
    		double mat[3][3];				
     
    	public:	
    		matrice(double x[3][3])
    		{
    			int i,j;
    			for(i=0;i<3;i++)
    			{
    				for(j=0;j<3;j++)
    				{
    					mat[i][j] = x[i][j];
    				}
    			}
    		}
     
    		friend vect prod(vect,matrice);
    };
     
    vect prod(vect d,matrice matrix)
    {
     
    	int i,j;
    	double somme;
    	vect resultat;
     
    	for(i=0;i<3;i++)
    	{
    		somme=0;
    		for(j=0;j<3;j++)
    		{
    			somme = somme + matrix.mat[i][j] * d.v[j];
    		}
    		resultat.v[i]=somme;
    	}
     
    	return resultat;
    }
     
    void main(void)
    {
    	vect toto(1,2,3);
    	double matrix[3][3]={1,2,3,4,5,6,7,8,9};
    	matrice essai1(matrix);
    	vect resultat;
     
    	toto.affichage();
    	resultat=prod(toto,matrix);
    	resultat.affichage();
     
    }
    j'aimerai comprendre pk je dois utiliser le mot friend pour la fonction prod, je ne comprend pas.
    lorsque j'ai enlevé prod, il m'a dit 3 erreur, je pense que c parce que la fonction n'a pas le droit d'accéder à matrix.mat ou d.v[j] par exemple.
    je trouve ça étonnant parce que j'aurai mis dans les 2 classes les lignes "vect prod(vect,matrice);"
    mais dans ce cas dans la définition? ou déclaration? j'aurai eu des problème, si c'est
    vect vect::prod (vect d, matrice matrix)
    ou
    matrice vect::prod (vect d, matrice matrix)

    => est-ce pour cela qu'il n'est pas possible d'éviter le mot friend et que je ne peux pas déclarer cette fonction tout comme je déclare les autres fonctions d'habitude dans ma classe ?
    et s'il est possible de déclarer cette fonction comme fonction membres sans le mot friend, alors pourriez vous me donner le code de déclaration/définition svp?

    pour l'utilisation de friend, d'après la faq c++, j'ai lu "Les amis sont parfois un meilleur choix d'un point de vue syntaxique (comme par exemple quand une fonction amie permet à un objet de type Fred d'être utilisé en tant que second paramètre de la fonction, tandis qu'une fonction membre obligerait à ce que l'objet Fred soit en premier). "
    => donc éviter le mot friend serait possible en mettant soit vecteur d en 1er soit matrice matrix en 1er ? je ne vois pas trop là la déclaration ou définition que ça aurait

    je vous remercie d'avance pour votre aide

  2. #2
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    Dans ton cas tu doit mettre friend tout simplement car ta fonction à besoin de toucher à des données privées de la class vect et matrice.

    Plutot que de créer une fonction, à ta place j'aurais créer un opérateur * membre de la classe. Cepandant la classe aurais tout de meme du être amie de l'autre pour acceder aux membres privées. A moi que tu définisse des accesseurs. Par contre je ne suis pas sur que ca soit la meilleur des idées niveau performance pour des classes comme les tiennent souvent employer dans de lourds calculs mathématiques. Dautres membres pourrons confirmer ou infirmer mes dires je pense.

    J'hèspère t avoir aidé
    J'aime pas les épinards... Mais alors pas du tout

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    Dans ton cas tu doit mettre friend tout simplement car ta fonction à besoin de toucher à des données privées de la class vect et matrice.
    -> oki merci

    en fait je me demandais surtout comment j'aurai pu éviter l'utilisation du mot "friend", juste si qqn pouvais écrire la déclaration et définiton
    comme je l'ai expliqué plus haut, je me demande si ça aurait été :
    vect vect::prod (vect d, matrice matrix)
    ou
    matrice vect::prod (vect d, matrice matrix)
    y aurait eu un conflit mais ça aurait pas marché sur les 2 (chais pas si je suis clair là, mais mon 1er post est plus clair )

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Peut-être en considérant un vecteur comme une matrice 1d ou en dérivant la classe matrice.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par isidore
    en fait je me demandais surtout comment j'aurai pu éviter l'utilisation du mot "friend", juste si qqn pouvais écrire la déclaration et définiton
    Je me pencherai sur la question quand tu m'auras expliqué pour quelle raison tu souhaites éviter l'utilisation de friend.

    A moins que tu fasse de ton programme une exercice de style Oulipiste, un peu comme La disparition de Perec, je ne vois pas vraiment. Friend permet une meilleur encapsulation. Friend est ton ami.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    lol je voulais seulement connaitre les différentes manières de faire
    y a la méthode simple, des méthodes plus longues
    ici friend est le + simple mais c bien aussi de savoir faire avec d'autre méthodes.
    mais bref pour l'instant je m'en tiendrai là

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo