Surchage le l'operateur >> en c++
Résolu
manio11
Messages postés
49
Statut
Membre
-
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 :
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
Configuration: Mac OS X Safari 532.5
A voir également:
- Surchage le l'operateur >> en c++
- 0466 quel opérateur - Forum Mobile
- 0496 quel opérateur ✓ - Forum Mobile
- 0668 quel opérateur ✓ - Forum Mobile
- 0493 quel operateur - Forum Mobile
- 0758 quel opérateur - Forum Vos droits sur internet
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.
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 ';'