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 -
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 :
et son code :
et dans ce cas, pour l'utiliser, l'appel dans le main() sera :
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 :
merci
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
A voir également:
- Surchage le l'operateur >> en c++
- Opérateur de réseau mobile - Guide
- 0466 quel opérateur - Forum Mobile
- 0668 quel opérateur ✓ - Forum Mobile
- 0758 quel opérateur - Forum Opérateurs & Réseaux mobiles
- 0650 quel opérateur - Forum Mobile
15 réponses
Salut.
Là je pense qu'il faut utiliser l'opérateur binaire et non le membre.
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.
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.
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 :
ex :
"marche" >> *pers1;
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 :
et dans la fonction main :
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 :
pensez vous vraiment que ce ne soit pas possible ?
merci
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
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
j'ai essayé ta methode comme ceci :
mais , j'ai 2 erreurs :
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'
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)*
si tu retourne &str, ton type de retour doit être cohérent (const string)*
meme en changeant, j'ai toujours l'erreur :
stp, peut tu me donner le code à ecrire ?
const std::string& Koala::operator>>(const std::string&, Koala&)' must take exactly one argument
stp, peut tu me donner le code à ecrire ?
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) { ... }
j'ai trouvé la solution en faisant ceci :
.h
.cpp
Merci quand même pour vos réponses.
.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.
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.
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'
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
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 ';'
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 ';'