Surchage le l'operateur >> en c++

Résolu
manio11 Messages postés 49 Statut Membre -  
manio11 Messages postés 49 Statut Membre -
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. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  2. loupius Messages postés 789 Statut Membre 148
     
    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
  3. manio11 Messages postés 49 Statut Membre 2
     
    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. loupius Messages postés 789 Statut Membre 148
       
      Ce n'est pas possible !!!
      0
  4. manio11 Messages postés 49 Statut Membre 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. loupius Messages postés 789 Statut Membre 148
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Et ma méthode, elle ne fonctionne pas ?
    0
  7. manio11 Messages postés 49 Statut Membre 2
     
    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
  8. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  9. manio11 Messages postés 49 Statut Membre 2
     
    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
  10. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  11. manio11 Messages postés 49 Statut Membre 2
     
    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
  12. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    ba c'est ce que je dit depuis le début... le type de retour est obligatoirement istream ???
    0
  13. manio11 Messages postés 49 Statut Membre 2
     
    oui, sans istream j'ai toujours un message d'erreur au niveau de la fonctiton main()
    0
  14. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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. manio11 Messages postés 49 Statut Membre 2
       
      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
  15. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  16. manio11 Messages postés 49 Statut Membre 2
     
    ok, dans ce cas ça marche.
    merci pour ton aide.
    0