Surchage le l'operateur >> en c++

Résolu
Bonjour,

Supposons qu'on ait une classe Personne dans laquelle on surchage l'operateur "<<" pour qu'il puisse afficher la chaine passée en parametre (ou l'utiliser dans une autre methode). le protype sera :
Personne&	  operator<<(const std::string &str);

et son code :
Personne& Personne::operator<<(const std::string &str))
{
	cout << this->nom << str << endl;
	return *this;
}


et dans ce cas, pour l'utiliser, l'appel dans le main() sera :
unePersonne << " marche"; //unePersonne etant un objet de la classe Personne


mon probleme est de savoir comment surchager l'operateur de flux ">>" afin qu'il fasse la meme chose que la surchage precedente, dont l'appel dans la fonction main() sera :

" marche" >> *unePersonne;


merci
Configuration: Mac OS X
Safari 532.5

15 réponses

  1. Contributeur
    Salut.
    Là je pense qu'il faut utiliser l'opérateur binaire et non le membre.
    type_retour operator>>(const std::string&,Personne&);
    Je pense que ça fonctionnera.
    0
    1. Je ne vois pas ce que tu veux faire exactement, mais en général c'est pour afficher ou saisir une classe; dans ce cas la surcharge des opérateurs de transfert s'effectue ainsi:
      #include <iostream>
      #include <string>
      #include <cstdlib>
      using namespace std;
      
      class Personne
      {
        public:
          Personne(string n="", int i=0)  : nom(n), id(i) {}
          friend ostream& operator<<(ostream& ostr, const Personne& pers)
          {
            ostr << pers.nom << " " << pers.id << " ";
            return (ostr);
          }
          friend istream& operator>>(istream& istr, Personne& pers)
          {
            istr >> pers.nom >> pers.id;
            return (istr);
          }
        private:
          string nom;
          int id;
      };
      
      int main(int argc, char *argv[])
      {
        Personne pers1("marcel"), pers2;
        cout << "un   " << pers1 << "début" << endl;
        cin >> pers2;
        cout << "deux " << pers2 << "fin" << endl;
        return (EXIT_SUCCESS);
      }
      Exemple:
      [loupius@p3000]$ g++ -Wall personne.cpp
      [loupius@p3000]$ ./a.out
      un   marcel 0 début
      marie 31             (à saisir)
      deux marie 31 fin
      [loupius@p3000]$
      Bonne réflexion.
      0
      1. merci, mais je connais cette surchage. je voudrai savoir comment surchager l'operateur >> afin d'avoir l'objet à droite du flux << et l'argument ) gauche.

        ex :
        "marche" >> *pers1;
        0
        1. Ce n'est pas possible !!!
          0
      2. c'est possible, je suis en train de faire un exercice tel qu'on demande de surchager l'operateur << afin d'utiliser l'argument passé en parametre , soit :

        Personne&	 operator<<(const std::string &action); // prototype


        Personne& Personne::operator<<(const std::string &action)
        {
        	cout << this->nom << action;
        	return *this;
        }
        


        et dans la fonction main :
        *Pers1 << " marche";


        dans ce cas, il n'ya pas de probleme, mais maintenant on demande de surchager l'operateur >> afin qu'il fasse la meme chose que la surchage precedente.

        soit un appel du genre :
        " marche" >> *Pers1;


        pensez vous vraiment que ce ne soit pas possible ?

        merci
        0
        1. Si, c'est possible. Il faut rajouter des opérateurs de transtypage.
          #include <iostream>
          #include <string>
          #include <cstdlib>
          using namespace std;
          
          class Personne
          {
            public:
              Personne() : nom(""), id(0) {}
              Personne(string n, int i) : nom(n), id(i) {}
              Personne(const char* n) : nom(n), id(0) {}
              Personne operator<< (const std::string &str)
              {
                cout << this->nom << " | " << str << endl;
                return *this;
              }
              friend Personne operator>> (Personne p1, Personne p2)
              {
                Personne p;
                cout << p1.nom << " § " << p2.nom << endl;
                return p;
              }
            private:
              string nom;
              int id;
          };
          
          int main(int argc, char *argv[])
          {
            Personne pers("loupius");
            pers << "action1";
            "action2" >> pers;
            return (EXIT_SUCCESS);
          }
          Exemple:
          [loupius@p3000]$ g++ -Wall personne.cpp
          [loupius@p3000]$ ./a.out
          loupius | action1
          action2 § loupius
          [loupius@p3000]$
          Mille excuses et bonne réflexion.
          0
      3. Contributeur
        Et ma méthode, elle ne fonctionne pas ?
        0
        1. j'ai essayé ta methode comme ceci :

          char* operator>>(const std::string& str,Personne&); // prototype
          
          char* operator>>(const std::string& str,Personne&) 
          {
          	cout << "test";
          	return &str;
          }
          
          "marche" >> *Pers1; // appel dans le main()
          
          


          mais , j'ai 2 erreurs :
          char* Personne::operator>>(const std::string&, Personne&)' must take exactly one argument
          no match for 'operator>>' in '" marche" >> *Pers1'
          0
          1. Contributeur
            ba oui, forcément, ça se met en dehors de la classe, c'est une fonction globale.
            si tu retourne &str, ton type de retour doit être cohérent (const string)*
            0
            1. meme en changeant, j'ai toujours l'erreur :

              const std::string& Koala::operator>>(const std::string&, Koala&)' must take exactly one argument


              stp, peut tu me donner le code à ecrire ?
              0
              1. Contributeur
                const std::string& Koala::operator>>(const std::string&, Koala&)

                En gras le problème.
                .h :
                class Personne
                {...
                Personne& operator<<(const string&);}
                const std::string& operator>>(const std::string&, Personne&);
                
                .cpp :
                Personne& Personne::operator<<(const string& str)
                {
                ///
                }
                const std::string& operator>>(const std::string& str,Personne&p)
                {
                ...
                }
                
                0
                1. j'ai trouvé la solution en faisant ceci :

                  .h
                  class Personne
                  {
                     ....
                    friend std::istream& operator>>(char* str, Personne& Pers1);
                    ....
                  }


                  .cpp
                  std::istream& operator>>(char* str, Personne& Pers1)
                  {
                    ...
                  }
                  


                  Merci quand même pour vos réponses.
                  0
                  1. Contributeur
                    ba c'est ce que je dit depuis le début... le type de retour est obligatoirement istream ???
                    0
                    1. oui, sans istream j'ai toujours un message d'erreur au niveau de la fonctiton main()
                      0
                      1. Contributeur
                        ba je ne sais pas ce que tu fais, mais chez moi ça fonctionne très bien. Essai le fichier suivant :
                        #include <string>
                        #include <iostream>
                        class person{double a;};
                        const std::string& operator>>(const std::string& a;person& b)
                        {
                          std::cout<<"OK\n";
                          return a;
                        }
                        person p;
                        int main()
                        {
                            "lhh">>p;
                             return 0;
                        }
                        Chez moi il compile et s'exécute.
                        0
                        1. je viens d'essayer le fichier et j'ai des erreurs avec :
                          ex_3.cpp:4: error: expected `)' before ';' token
                          ex_3.cpp:4: error: 'const std::string& operator>>(const std::string&)' must take exactly two arguments
                          ex_3.cpp:4: error: expected initializer before ')' token
                          ex_3.cpp: In function 'int main()':
                          ex_3.cpp:12: error: no match for 'operator>>' in '"lhh" >> p'
                          0
                      2. Contributeur
                        J'ai en effet fait une erreur en recopiant le fichier source (je compile sous Linux mais suis sur Internet sur Windows -> pas de copier coller) c'est
                        const std::string& operator>>(const std::string& a,person& b)

                        et non "const std::string& operator>>(const std::string& a;person& b)"
                        L'erreur du compilateur est assez explicite : il attend que tu ferme la parenthèse avant de finir la commande par ';'
                        0
                        1. ok, dans ce cas ça marche.
                          merci pour ton aide.
                          0