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 : surcharge d'opérateurs


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut classe : surcharge d'opérateurs
    Bonsoir,

    J'ai crée une classe vecteur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Vecteur
    {
    public:
    	Vecteur(double a=0., double b=0., double c=0.){x=a;y=b;z=c;} // constructeur par défaut
    	Vecteur operator +( const Vecteur & );
    	Vecteur& operator *( double ) ;
    	void affiche() { cout<<"("<<x<<","<<y<<","<<z<<")"<<endl;}
    private:
    double x,y,z; // coordonnees
    };
    Seulement j'ai un problème pour surcharger l'opérateur *, qui sera ici la multiplication d'un vecteur par un double.

    J'ai comme fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Vecteur& Vecteur::operator * ( double a)
    {
    	x=a*x;
    	y=a*y;
    	z=z*a;
    	return *this;
    }
    Seulement, avec ce code, je peux seulement multiplier à droite par un double, et pas à gauche :

    Comment faire pour pouvoir multiplier par un double à la fois à droite et à gauche ?

    Merci beaucoup.

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Tu ne peux pas comme ca.
    C++ ne fait aucune prédiction sur la commutativité d'un opérateur.
    => 2 Solutions :
    crée un opérateur* avec ses paramètre en position inversé comparé au 1er
    Jouer sur les casts.

    Personelement, je préfère le 1 car le 2 peux avoir des concéquences néfastes ailleurs
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    /!\ ATTENTION ton code actuel confond les opérateurs * et *= /!\

    Typiquement, pour la commutativité il faut mettre l'opérateur hors de la classe:
    Code C++ : 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
    Vecteur& Vecteur::operator *= ( double a)
    {
    	x=a*x;
    	y=a*y;
    	z=z*a;
    	return *this;
    }
    Vecteur operator * (Vecteur const &v, double a)
    {
    	Vecteur ret(v);
    	ret *= a;
    	return ret;
    }
    Vecteur operator * (double a , Vecteur const &v)
    {
    	return v * a;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    Merci pour vos réponses.

    Medinoc >> Je ne comprends pas pourquoi mon code confond les opérateurs * et *= ??
    Si je tape :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Vecteur v1(1.,1.,1.);
    Vecteur c;
    c=v1*2;
    c.affiche();
    J'obtiens bien le vecteur (2,2,2).

    Davidbrcz >> J'avais effectivement pensé à inverser mais types mais je ne vois pas comment, parce que quand on écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vecteur Vecteur::operator * ( type )
    J'aurais de toute façon un type Vecteur à gauche du * ( par défaut ? ) donc je vois pas comment changer ça

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Ton code pour l'opérateur * modifie le vecteur, c'est donc l'équivalent d'un opérateur *=...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    ah d'accord, je viens de comprendre !

    J'avais pas compris que quand on écrit Vecteur::operator * , on modifie le vecteur.

    Merci en tout cas !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    J'ai un petit problème par contre, j'essaye de faire l'addition de 2 vecteurs, j'ai donc rajouté dans ma classe la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    friend Vecteur operator + (  const Vecteur & ,  const Vecteur & );
    et hors de la classe la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Vecteur operator + (  Vecteur &v1,  Vecteur &v2)
    {
    	Vecteur res;
    	res.x=v1.x+v2.x;
    	res.y=v1.y+v2.y;
    	res.z=v1.z+v2.z;
    	return res;
    }
    Mais le compilateur me dit qu'il ne peut pas accéder à x, y et z car ils sont privés. Mais je ne comprends pas le problème vu que j'ai définie la fonction comme amie ?

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    operator + ( const Vecteur & , const Vecteur & ); et operator + ( Vecteur &, Vecteur &) sont deux fonctions différentes.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    Oui, j'ai vu le problème des const, mais ça ne change rien, même en les mettant

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    je mets mon code en entier ça sera peut-etre plus clair :
    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
     
    #include <iostream>
    #include <cmath>
    #include <string>
     
    using namespace std;
     
    class Vecteur
    {
    public:
    	Vecteur(double a=0., double b=0., double c=0.){x=a;y=b;z=c;} // constructeur par défaut
     
    	friend Vecteur operator + (  const Vecteur & ,  const Vecteur & );
     
    	void affiche() { cout<<"("<<x<<","<<y<<","<<z<<")"<<endl;}
     
    private:
    double x,y,z; // coordonnees
    };
     
     
     
    /*****************************/
    /*     Fonctions membres     */
    /*****************************/
     
     
     
    Vecteur operator + ( const Vecteur &v1,  const Vecteur &v2)
    {
    	Vecteur res;
    	res.x=v1.x+v2.x;
    	res.y=v1.y+v2.y;
    	res.z=v1.z+v2.z;
    	return res;
    }
     
     
    int main()
    {
     
    	Vecteur v1(1.,1.,1.);
    	Vecteur v2(0.5,0.7,0.4);
    	Vecteur w;
    	w=(v1+v2);
    	w.affiche();
     
     
    	return 0;
    }

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Ce code ne fait aucune erreur chez moi sous Visual...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    J'ai aussi Visual C++ et ça me donne ça :

    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
    Compiling...
    surcharge1.cpp
    C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(35) : error C2248: 'x' : cannot access private member declared in class 'Vecteur'
            C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(21) : see declaration of 'x'
    C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(35) : error C2248: 'x' : cannot access private member declared in class 'Vecteur'
            C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(21) : see declaration of 'x'
    C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(35) : error C2248: 'x' : cannot access private member declared in class 'Vecteur'
            C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(21) : see declaration of 'x'
    C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(36) : error C2248: 'y' : cannot access private member declared in class 'Vecteur'
            C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(21) : see declaration of 'y'
    C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(36) : error C2248: 'y' : cannot access private member declared in class 'Vecteur'
            C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(21) : see declaration of 'y'
    C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(36) : error C2248: 'y' : cannot access private member declared in class 'Vecteur'
            C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(21) : see declaration of 'y'
    C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(37) : error C2248: 'z' : cannot access private member declared in class 'Vecteur'
            C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(21) : see declaration of 'z'
    C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(37) : error C2248: 'z' : cannot access private member declared in class 'Vecteur'
            C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(21) : see declaration of 'z'
    C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(37) : error C2248: 'z' : cannot access private member declared in class 'Vecteur'
            C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(21) : see declaration of 'z'
    C:\Program Files\Microsoft Visual Studio\MyProjects\surcharge1\surcharge1.cpp(48) : error C2593: 'operator +' is ambiguous
    Error executing cl.exe.
    Je comprends vraiment pas, c'est quand même génant si ça compile bien chez toi
    Je vais redémarrer l'ordi, on sait jamais.

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    As-tu VC++ 6 ?
    Je compile sous 2005...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    Oui, j'ai la version 6.0
    Mais quand même, ça devrait marcher, c'est un peu embetant, déjà que j'ai souvent des erreurs, alors si en plus quand c'est bon il me dit que c'est faux

  15. #15
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Pareil, sous 2005 j'ai aucun problème...

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Visual 6 date d'avant les standards, donc forcément ce n'est vraiment pas ce qu'il y a de mieux pour compiler en C++...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    J'ai téléchargé dev c++ et ça fonctionne. ouf !

    Merci pour votre aide

  18. #18
    Invité
    Invité(e)
    Par défaut
    Visual C++ Express Edition est gratuit, tu peux essayer ça si tu veux rester dans la gamme Visual Studio. C'est un excellent compilateur et débogueur, et les messages d'erreur seront peut-être un peu plus faciles à comprendre qu'avec Dev C++ qui utilise GCC.

    Par contre, juste une note pour la forme, si tu fournis des accesseurs pour les coordonnées de ton vecteur, tu peux très bien définir l'addition dans une fonction non-amie, ce qui réduit le couplage (plus il y a de fonctions qui connaissent l'implémentation de ta classe, plus cette implémentation devient difficile à modifier par la suite).

    Carl

  19. #19
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    L'amitié n'apporte rien dans ce cas particulier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Vecteur operator+(Vecteur const& lhs, Vecteur const& rhs) {
       return Vecteur(lhs)+=rhs;
    }
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  20. #20
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Note: Si tu prends VS Express, prends-le en anglais. La traduction française est déplorable.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [VBA] Surcharge d'opérateur dans une classe VBA
    Par remitbo dans le forum Général VBA
    Réponses: 1
    Dernier message: 17/09/2011, 07h27
  2. Réponses: 5
    Dernier message: 24/08/2011, 16h34
  3. Réponses: 3
    Dernier message: 02/03/2010, 08h16
  4. exporter une classe + surcharge de l'opérateur <<
    Par salseropom dans le forum C++
    Réponses: 5
    Dernier message: 25/06/2009, 13h49
  5. Surcharge d'opérateur dans une classe template
    Par Opérateur dans le forum Langage
    Réponses: 6
    Dernier message: 22/12/2008, 03h26

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