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
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
A voir également:
- Surchage le l'operateur >> en c++
- 0758 quel opérateur - Forum Vos droits sur internet
- 0650 quel opérateur - Forum Opérateurs & Réseaux mobiles
- Cen numéro est chez quel opérateur ? - Forum Opérateurs & Réseaux mobiles
- 0473 quel opérateur - Forum Loisirs / Divertissements
- 0778 quel opérateur ✓ - Forum Mobile
15 réponses
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
12 janv. 2010 à 11:53
12 janv. 2010 à 11:53
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.
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
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.
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
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 :
ex :
"marche" >> *pers1;
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
12 janv. 2010 à 13:35
Ce n'est pas possible !!!
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
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 :
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
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
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
12 janv. 2010 à 14:09
12 janv. 2010 à 14:09
Et ma méthode, elle ne fonctionne pas ?
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
12 janv. 2010 à 14:26
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'
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
12 janv. 2010 à 15:01
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)*
si tu retourne &str, ton type de retour doit être cohérent (const string)*
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
12 janv. 2010 à 15:26
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 ?
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
12 janv. 2010 à 15:59
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) { ... }
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
13 janv. 2010 à 00:00
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.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
13 janv. 2010 à 08:13
13 janv. 2010 à 08:13
ba c'est ce que je dit depuis le début... le type de retour est obligatoirement istream ???
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
13 janv. 2010 à 13:15
oui, sans istream j'ai toujours un message d'erreur au niveau de la fonctiton main()
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
13 janv. 2010 à 14:07
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.
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
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'
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
15 janv. 2010 à 12:49
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
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 ';'
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
15 janv. 2010 à 17:13
ok, dans ce cas ça marche.
merci pour ton aide.
merci pour ton aide.