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

Linux Discussion :

problème surcharge operator+ (UNIX)


Sujet :

Linux

  1. #1
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut problème surcharge operator+ (UNIX)
    Bonsoir à tous.

    Je rencontre un problème avec la surcharge de l'opérateur+.

    En fait, je dois gèrer les pièces d'un musée; je dois donc pouvoir rentrer un nom, date, prix d'achat,...

    Pour le prix d'achat de la pièce, on me dit que je dois pouvoir le modifier en ajoutant ou en retirant une somme d'argent. Je souhaiterais donc pour cela surcharger les opérateurs + et -.

    Pour ce faire je procède de la façon suivante:

    Code dans PieceMusee.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PieceMusee operator+(const float montant);
    	PieceMusee operator-(const float montant);
    Code dans PieceMusee.cxx:
    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
    PieceMusee PieceMusee::operator+ (const float montant)
    {
    	PieceMusee d(*this);
     
    	if( montant > 0)
    	{
    		d.PrixPiece = d.PrixPiece + montant;
    /*dans le cas ou la piece dépasse une certaine valeur je dois changer une variable membre de valeur (un bool)*/
    		if(getPrixPiece() > 50000 && getPretPiece() == true)
    			d.PretPiece = false;
    	}
     
    	return d;
    }
     
    PieceMusee PieceMusee::operator- (const float montant)
    {
    	PieceMusee d(*this);
     
    	if(montant > getPrixPiece())
    	{
    		d.PrixPiece = d.PrixPiece - montant;
    		if((getPrixPiece() < 50000) && (getPretPiece() == false ))
    			d.PretPiece = true;
    	}
     
    	return d;
    }
    Appel de mes opérateurs surcharger dans main.cxx:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cout<<"Veuillez saisir la valeur a ajouter: ";
    				float Pa;
    				cin>>Pa;
    				*pm1 = *pm1 + Pa;
    Je travaille avec un objet alloué dynamiquement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pm1 = new PieceMusee;
     
    pm1 est bien de type PieceMusee*
    Voilà donc mon code. Maintenant, lorsque je lance la compilation pas de problème. (Mon makefile fonctionne parfaitement).
    Par contre quand je fais appel à mon opérateur surcharger, j'ai l'erreur suivante qui se produit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BUS ERROR (core dumped)
    Quelqu'un pourrait-il me dire ce que signifie ce message et ce que je pourrais faire pour ne plus l'avoir?

    Je vous remercie d'avance pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Le problème est ailleurs.
    Pense tout de même à faire en sorte que tes opérateurs membres soient const.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 580
    Points
    41 580
    Par défaut
    On ne connait pas ton operator=.
    Et pour éviter des copies inutiles, tu devrais aussi définir un opérateur +=...

  4. #4
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    L'opérateur + sur un objet PieceMusee, c'est pas très instinctif, non ?
    Pourquoi pas juste quelque chose comme PieceMusee::setPrix() ?

  5. #5
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Je suis d'accord avec toi Hylvenir.

    J'ai déjà une méthode setPrixPiece().

    Mais pour des raisons pédagogiques, les profs veulent nous faire utiliser une surcharge pour les opérateurs :+, -, <<, >> (il précise de ne pas dédicacer << à cout). Je ne sais pas ce que signifie dédicacer, je verrais par après.

    Donc pour la surcharge, je ne voit pas d'autre endroit ou je pourrais avoir besoin d'une surcharge de l'opérateur + .
    Je cite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Une pièce pouvant acquérir de la valeur pour des raisons diverses, les opérateurs + et - seront donc définis ici dans le but de modifier la valeur de la pièce.
    Moi aussi j'aurais trouver plus logique de resaisir la nouvelle valeur de la pièce, mais bon , les profs ont toujours raison

    Pense tout de même à faire en sorte que tes opérateurs membres soient const.
    Je le fais comment? Où dois-je placer le const dans le prototype?

    On ne connait pas ton operator=.
    Et pour éviter des copies inutiles, tu devrais aussi définir un opérateur +=...
    J'essayerais donc de remplacer l'opérateur + par le += et le - par -= alors? Je doit tout de même demander confirmation au prof pour voir si on peut le faire ainsi. Je vais le faire dans une autre version pour tester. Et si ca marche je demande pour adapter.

    Merci des conseils et réponses rapide à tous. Bonne soirée.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Donc, si on essaye de suivre l'idée de ton prof...

    Il veut que tu surcharge l'opérateur +, l'opérateur -, l'opérateur = et les opérateurs de direction de flus...

    Il faudrait quand meme essayer de lui faire comprendre que les opérateurs arithmétiques "idéaux" sont +=, -=, *= et /= ...

    M'enfin, bon, comme l'idée, c'est quand meme de faire ses points, il vaut mieux partir de l'idée que "ce que prof veut, dieu le veut"

    Voici donc ce que je te propose (pour ce qui est de la surcharge des opérateurs +, -, * et =, du moins)
    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
     
    class PieceMusee
    {
        public:
            PieceMusee(){};
            ~PieceMusee(){};
            PieceMusee& operator +(const float prix)
            {
                Prix+=prix;
                return *this;
            }
            PieceMusee& operator -(const float prix)
            {
                Prix-=prix;
                return *this;
            }
            PieceMusee& operator =( PieceMusee& pc)
            {
                if(this==&pc)
                    return *this;
                Prix=pc.Prix;
                return *this;
            }
            void SetPrix(const float prix){Prix=prix;}
            const float GetPrix(){return Prix;}
        private:
            float Prix;
    };
    (désolé, j'avais la flegme de faire deux fichiers, et n'oublie pas de compléter ta classe )

    Pour ce qui est de la surcharge des opérateurs << et >>, visiblement, il souhaiterait qu'ils puissent fonctionner aussi bien avec les entrées sorties standard (cin et cout) qu'avec les entrées et sorties sur des fichiers, par exemple...

    Le mieux que tu aies à faire, c'est donc de surcharger les opérateur sur les istream et les ostream (qui servent de classe de base à tous les autres flux)

    Cela prendrait la forme de
    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
     
    friend std::istream& operator >>(std::istream& ifs, PieceMusee& pcm)
    {
        ifs>>pcm.Prix; 
        //sans oublier les autres membres
        //pour pouvoir mettre des >> en série
        return ifs; 
    }
    friend std::ostream& operator <<(std::ostream& ofs, const PieceMusee& pcm)
    {
        ofs<<pcm.Prix;
        //sans oublier les autres membres
        //pour pouvoir mettre des << en série
        return ofs; 
    }
    Ce qui permettra, par exemple, l'utilisation d'un code ressemblant à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        std::ofstream ofs("fichier.txt");
        ofs<<*pm1<<"\n"<<"fini"<<std::endl;
    //====ou====ou====ou====
        std::cout<<*pm1<<std::endl;
    (j'ai utilisé *pm1 parce que tu en faisais une allocation dynamique, ca va de soi )

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Au fait...

    Dans la FAQ, il est écrit que l'amitié n'est ni hérité, ni transitive, ni réciproque...

    Or, quand on y regarde bien, le code que j'ai fournis (et testé avant de le présenter) permet de travailler avec n'importe quel flux... du moment que l'opérateur adéquat soit utilisé...

    S'agit-il d'une erreur dans la FAQ, ou d'une implémentation spéciale qui le permet (une surcharge des opérateurs dans l'implémentation des flux, peut etre )

  8. #8
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Je te remercie beaucoup koala01.

    Ta solution pour la surcharge des opérateurs + et - fonctionne parfaitement.
    Je n'ai même pas besoin de surcharger l'opérateur =. Peut être que par après dans l'énoncé je devrais le faire, mais jusqu'ici tout va pour le mieux.

    Je vais maintenant essayer de comprendre la surcharge des opérateurs << et >> et essayer d'appliquer tes quelques conseils.

    Encore merci et bonne soirée.


    p.s.: désolé pour le retard de réponse mais je n'avais plus de connection sur le serveur sur lequel je bosse alors ai pas su tester tout de suite...

    EDIT:

    Ben voilà je viens de tester la surcharge des opérateurs << et>> et tout marche nickel. J'ai plus avancer en 1 jour que les deux semaines précédentes.

    Je vous dit encore merci à tous pour votre aide, et vous souhaite une bonne fin de week-end...

    Bien à vous Richard

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Mais de rien...

    Juste une petite chose pour me rassurer (et sans doute les autres aussi, d'ailleurs)...

    L'avancée en deux jours dont tu nous remercie, c'est juste au niveau du devoir, ou bien tu as carrément compris les principes que l'on a essayé d'expliquer

  10. #10
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Ben en fait je vais être franc.

    Je carrément de comprendre le principe. Les principes sont expliquer dans le cours, mais je m'en sortait pas des masses. Alors je me suis dit, vas sur developpez.com eux c'est des bêtes de la progra...

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

Discussions similaires

  1. surcharge operator[] problème type retour
    Par -Gesicht- dans le forum C++
    Réponses: 9
    Dernier message: 13/06/2013, 01h04
  2. probléme surcharge operator+
    Par digofwall dans le forum Langage
    Réponses: 5
    Dernier message: 02/11/2009, 14h35
  3. problème surcharge operator= C++
    Par cyberlulu dans le forum C++
    Réponses: 9
    Dernier message: 27/06/2008, 11h28
  4. [Pb de débutant, et encore] surcharge operator =
    Par 10_GOTO_10 dans le forum C++Builder
    Réponses: 5
    Dernier message: 11/01/2006, 02h30
  5. Namespace et surcharge operator new/delete
    Par ZeLegolas dans le forum C++
    Réponses: 11
    Dernier message: 26/07/2005, 13h55

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