Surchage le l'operateur >> en c++

Résolu/Fermé
manio11 Messages postés 49 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 23 juin 2010 - 12 janv. 2010 à 11:30
manio11 Messages postés 49 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 23 juin 2010 - 15 janv. 2010 à 17:13
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

15 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
12 janv. 2010 à 11:53
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
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
12 janv. 2010 à 12:48
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
manio11 Messages postés 49 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 23 juin 2010 2
12 janv. 2010 à 13:22
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
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
12 janv. 2010 à 13:35
Ce n'est pas possible !!!
0
manio11 Messages postés 49 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 23 juin 2010 2
12 janv. 2010 à 13:45
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
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
12 janv. 2010 à 15:08
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
12 janv. 2010 à 14:09
Et ma méthode, elle ne fonctionne pas ?
0
manio11 Messages postés 49 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 23 juin 2010 2
12 janv. 2010 à 14:26
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
12 janv. 2010 à 15:01
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
manio11 Messages postés 49 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 23 juin 2010 2
12 janv. 2010 à 15:26
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
12 janv. 2010 à 15:59
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
manio11 Messages postés 49 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 23 juin 2010 2
13 janv. 2010 à 00:00
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
13 janv. 2010 à 08:13
ba c'est ce que je dit depuis le début... le type de retour est obligatoirement istream ???
0
manio11 Messages postés 49 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 23 juin 2010 2
13 janv. 2010 à 13:15
oui, sans istream j'ai toujours un message d'erreur au niveau de la fonctiton main()
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
13 janv. 2010 à 14:07
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
manio11 Messages postés 49 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 23 juin 2010 2
15 janv. 2010 à 11:37
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
15 janv. 2010 à 12:49
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
manio11 Messages postés 49 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 23 juin 2010 2
15 janv. 2010 à 17:13
ok, dans ce cas ça marche.
merci pour ton aide.
0