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 :

classe vecteur3D, passage par référence


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut classe vecteur3D, passage par référence
    J'ai fait une classe vecteur3d qui permet de renvoyer le vecteur qui a la norme maximum. L'un est passage par référence, l'autre par valeur.
    Qu'en pensez vous?



    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
     
    class vecteur3d {
    private:
        float x,y,z;
    public:
     
          vecteur3d(float,float,float);
          vecteur3d();
          int vecteurnormmax(vecteur3d);
    };
     
    vecteur3d::vecteur3d(){
    x=y=z=0;}
     
    vecteur3d::vecteur3d(float t,float tt,float ttt){
    x=t;y=tt;z=ttt;}
     
    int vecteur3d::vecteurnormmax(vecteur3d v){
    double norme1= sqrt(x*x+y*y+z*z);
    double norme2= sqrt(v.x*v.x+v.y*v.y+v.z*v.z);
    int a=1;
    if (norme2<norme1) a=2;
    return a;
    }
     
    void main(){
    vecteur3d X(2,1,3);
    vecteur3d Y(1,4,2);
    cout<<Y.vecteurnormmax(X);
     
    }
    Passage par référence:

    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
     
    class vecteur3d {
    private:
        float x,y,z;
    public:
     
          vecteur3d(float,float,float);
          vecteur3d();
          int vecteurnormmax(vecteur3d * );
    };
     
    vecteur3d::vecteur3d(){
    x=y=z=0;}
     
    vecteur3d::vecteur3d(float t,float tt,float ttt){
    x=t;y=tt;z=ttt;}
     
    int vecteur3d::vecteurnormmax(vecteur3d *v){
    double norme1= sqrt(this->x*this->x+this->y*this->y+this->z*this->z);
    double norme2= sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    int a=1;
    if (norme2<norme1) a=2;
    return a;
    }
     
    void main(){
    vecteur3d X(2,1,3);
    vecteur3d Y(1,4,2);
    cout<<Y.vecteurnormmax(&X);
     
    }

  2. #2
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Salut !

    Corrigez moi si je me trompe, mais d'après moi tu ne passes pas par référence ici, tu passes un pointeur vers un objet. Le passage par référence se fait comme ceci :

    int vecteur3d::vecteurnormmax(vecteur3d &v)

    Quand tu appeleras la fonction, tu ne passeras donc pas l'adresse de l'objet mais une référence vers l'objet :

    int machin = v.vecteurnormmax (v2); // Pas de &v2

    C'est la meilleure solution, ça t'évite d'avoir un appel au constructeur quand tu passes par valeur, et ça t'évite la syntaxe des pointeurs :

    double norme2= sqrt(v.x*v.x+v.y*v.y+v.z*v.z); // En gros tu utilises comme si tu passais par valeur, sauf que c'est avec une référence ^^.


    Deuxième remarque, les this->x, c'est inutile ! Fait tout simplement x.

    Sinon, personnellement je trouve ça assez étrange comme syntaxe pour déterminer quel est le vecteur à la plus grande norme de faire une fonction membre, je trouve ça plus logique de faire une syntaxe comme ceci :

    PlusGrandeNorme (v1, v2), plutôt que v1.PlusGrandNorme (v2)

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    [/QUOTE]
    Corrigez moi si je me trompe, mais d'après moi tu ne passes pas par référence ici, tu passes un pointeur vers un objet. Le passage par référence se fait comme ceci :int vecteur3d::vecteurnormmax(vecteur3d &v)
    [/QUOTE]

    Non, par référence, ca se fait avec *. Avec &, cela s'appelle par adresse.

    [/QUOTE]
    Sinon, personnellement je trouve ça assez étrange comme syntaxe pour déterminer quel est le vecteur à la plus grande norme de faire une fonction membre, je trouve ça plus logique de faire une syntaxe comme ceci :

    PlusGrandeNorme (v1, v2), plutôt que v1.PlusGrandNorme (v2)
    [/QUOTE]

    C'était un exo ou il fallait queje fasse une fonction membre qui compare les normes.

  4. #4
    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 : 51
    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
    Par défaut
    Citation Envoyé par Bakura
    Le passage par référence se fait comme ceci :

    int vecteur3d::vecteurnormmax(vecteur3d &v)

    [...]
    C'est la meilleure solution, ça t'évite d'avoir un appel au constructeur quand tu passes par valeur, et ça t'évite la syntaxe des pointeurs :
    Ce n'est pas la meilleure solution, la meilleure solution est le passage par référence constante, qui a l'avantage de permettre de passer des objets constants, mais aussi des temporaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v.vecteurnormmax(v2+v3);
    Ne marcherait pas avec des références non constantes.
    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.

  5. #5
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Citation Envoyé par JolyLoic
    Ce n'est pas la meilleure solution, la meilleure solution est le passage par référence constante, qui a l'avantage de permettre de passer des objets constants, mais aussi des temporaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v.vecteurnormmax(v2+v3);
    Ne marcherait pas avec des références non constantes.
    Oui exact, en plus c'est ce que je fais à chaque fois en plus :/.

    Non, par référence, ca se fait avec *. Avec &, cela s'appelle par adresse.
    Non, le passage par référence se fait avec l'opérateur & .

    int * i = &machin; // La c'est l'adresse

    mais :

    void MaFonction (const monObjet & obj); // La c'est par référence

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    le mieux a mon avis , c est (compilation des differentes reponses)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class vector3d {
     
    public:
     
      friend int vectormax(const vector3d & src1,const vector3d & src2){
       ...
      }
    };
    note:

    tes sqrt sont inutiles dans ta comparaison car c est une fonction strictement croissante

  7. #7
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    tes sqrt sont inutiles dans ta comparaison car c est une fonction strictement croissante
    Exact!!!


    Que signifie le mot clé: Friend?

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

Discussions similaires

  1. Passage par référence entre class
    Par Glandelf dans le forum C++
    Réponses: 17
    Dernier message: 19/07/2012, 11h02
  2. Réponses: 9
    Dernier message: 31/01/2012, 23h11
  3. Réponses: 4
    Dernier message: 26/12/2009, 20h48
  4. Passage par référence
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2005, 11h17
  5. Problème très rapide de passage par référence
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 23/06/2005, 10h02

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