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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 395
    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 395
    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 395
    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 395
    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 ?

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