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
A voir également:
- Surchage le l'operateur >> en c++
- Opérateur de réseau mobile - Guide
- 0668 quel opérateur ✓ - Forum Mobile
- 0466 quel opérateur - Forum Mobile
- 0758 quel opérateur - Forum Opérateurs & Réseaux mobiles
- 0785 quel operateur ✓ - 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 ';'