Surchage le l'operateur >> en c++

Résolu
manio11 Messages postés 49 Date d'inscription   Statut Membre Dernière intervention   -  
manio11 Messages postés 49 Date d'inscription   Statut Membre Dernière intervention   -
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Membre Dernière intervention   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
manio11 Messages postés 49 Date d'inscription   Statut Membre Dernière intervention   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
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
Ce n'est pas possible !!!
0
manio11 Messages postés 49 Date d'inscription   Statut Membre Dernière intervention   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
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   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

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

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Et ma méthode, elle ne fonctionne pas ?
0
manio11 Messages postés 49 Date d'inscription   Statut Membre Dernière intervention   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
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Membre Dernière intervention   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
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Membre Dernière intervention   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
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Membre Dernière intervention   2
 
oui, sans istream j'ai toujours un message d'erreur au niveau de la fonctiton main()
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Membre Dernière intervention   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
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Membre Dernière intervention   2
 
ok, dans ce cas ça marche.
merci pour ton aide.
0