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 :

Problème surcharge opérateur


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2010
    Messages : 38
    Par défaut Problème surcharge opérateur
    Bonjour,

    Mon problème est assez simple. J'aimerais juste faire une surcharge de l'opérateur de flux << mais malgré quelques recherches sur google, j'ai pas vraiment compris comment l'implémenter correctement.

    Je reçois cette erreur à la compilation :
    error: 'std::ostream& BigInt::operator<<(std::ostream&, const BigInt&)' must take exactly one argument

    Du code parle plus que des mots ^^

    Fichier .H
    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
     
    #ifndef INCLUDE_ME
    #define INCLUDE_ME
     
    #include <iostream>
    #include <vector>
     
    using namespace std;
     
    class BigInt
    {
        private:
            vector<int> number;
     
        public:
            // Constructeurs
            BigInt(int number);
            BigInt(string number);
     
            // Operators
            ostream& operator<<(ostream& flux, const BigInt& bigNumber);
    };
     
    #endif
    Fichier .CPP
    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
     
    #include "BigInt.h"
     
    // Constructeurs
    BigInt::BigInt(int number)
    {
        this->number[0] = number;
    }
     
    BigInt::BigInt(string number)
    {
        for (int i = 0; i < number.size(); i++)
        {
            this->number.push_back((int)number[i]);
        }
    }
     
    // Operators
    ostream& BigInt::operator<<(ostream& flux, const BigInt& bigNumber)
    {
        //return flux;
    }
    Ce qui me semblait bizarre c'est que je met ma définition de méthode en public !

    Je peux pas en dire plus juste ce petit détail que je trouve bizarre :S !

    Merci d'avance pour votre aide !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Par défaut
    essaye en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ostream& operator<<(ostream& flux, const BigInt& bigNumber);
    comme fonction (globale) amie de BigInt

  3. #3
    Membre averti
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2010
    Messages : 38
    Par défaut Remerciement (autre moyen)
    Merci pour ta réponse ça marche !

    J'ai modifié ma définition en global amis de BigInt et aussi j'ai du modifier l'implémentation de ma méthode en enlevant le BigInt:: de ma méthode.

    Mais ça m'interpelle :S

    Est-ce la seul solution possible où existe-t-il une autre solution ?

    J'espère que j'aurais réponse à ma question ^^
    Merci pour ta solution kessoufi

    Fichier .H
    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
     
    #ifndef INCLUDE_ME
    #define INCLUDE_ME
     
    #include <iostream>
    #include <vector>
     
    using namespace std;
     
    class BigInt
    {
        // Operators
        friend ostream& operator<<(ostream& flux, const BigInt& bigNumber);
     
        private:
            vector<int> number;
     
        public:
            // Constructeurs
            BigInt(int number);
            BigInt(string number);
    };
     
    #endif
    Fichier .CPP
    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
     
    #include "BigInt.h"
     
    // Constructeurs
    BigInt::BigInt(int number)
    {
        this->number[0] = number;
    }
     
    BigInt::BigInt(string number)
    {
        for (int i = 0; i < number.size(); i++)
        {
            this->number.push_back((int)number[i]);
        }
    }
     
    // Operators
    ostream& operator<<(ostream& flux, const BigInt& bigNumber)
    {
        //return flux;
    }

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Si tu veux que cet opérateur soit membre de ta classe, il faut si je ne me trompe pas le déclarer ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ostream & operator <<( ostream & p_stream);
    et dans l'implémentation, pareil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ostream& BigInt::operator<<(ostream& flux)
    {
        // tit code qui va bien, genre :
        for (vector<int>::iterator l_it = number.begin() ; l_it != number.end() ; ++l_it)
        {
            flux << (* l_it);
        }
        return flux;
    }
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  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 : 50
    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
    En faisant ça, tu pourras écrire BigInt << cout, pas cout << BigInt...
    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
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    ah oui, effectivement
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    La règle pour les opérateurs binaires est simple:
    • s'il est déclaré dans une classe alors l'opérande de gauche est l'instance utilisée pour l'appel, l'opérande de droite celle passé en argument ;
    • s'il est déclaré hors de la classe alors l'opérande de gauche est le premier argument, l'opérande de droite le second.


    Du coup si tu voulais écrire:
    l'opérande de gauche étant cout, il aurait fallu écrire l'opérateur membre de la classe ostream, c'est une classe de la bibliothèque standard : tu ne dois pas la modifier et donc tu l'écris en global pour obtenir le comportement souhaité.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634

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

Discussions similaires

  1. Surcharge opérateur +
    Par nunurs83 dans le forum C++
    Réponses: 6
    Dernier message: 31/10/2006, 09h48
  2. [Débutant]Surcharge opérateur +
    Par Geolem dans le forum Débuter
    Réponses: 13
    Dernier message: 05/12/2005, 10h16
  3. Problème d'opérateur
    Par iomega dans le forum Langage
    Réponses: 18
    Dernier message: 17/11/2005, 11h31
  4. surcharge opérateur << et >>
    Par Azharis dans le forum Débuter
    Réponses: 11
    Dernier message: 02/11/2005, 21h22
  5. Surcharge opérateurs
    Par ghostdogpr dans le forum C++
    Réponses: 5
    Dernier message: 18/03/2005, 11h51

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