[Résolu] Redéfinition de l'operateur << pour ofstream

Redéfinition de l'operateur << pour ofstream [Résolu] - C++ - Programmation

Marsh Posté le 03-12-2005 à 20:07:52    

Bonjour, j'ai un problème avec la rédéfinition de l'opérateur << pour un ofstream, tout compile sans problème seulement à l'écriture il ne passe pas dans la redéfinition. Alors que les arguments sont ( me semblent ) corrects.

 

Voici le code :

 
Code :
  1. // Le main :
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string>
  5. #include <vector>
  6. #include "Client.h"
  7. #include "ClientAbonne.h"
  8. #include "Oeuvre.h"
  9. #include "Representation.h"
  10. #include "Reservation.h"
  11. #include "ReservationGroupee.h"
  12. #include "Menu.h"
  13. using namespace std;
  14. int main ( void )
  15. {
  16. vector<Client *> listeCli;
  17. vector<Oeuvre> listeSpec;
  18. Client * cl  = new Client("scalzo","Loris","rue test","06400" );
  19. Oeuvre sp("les miserables","Victor Hugo" );
  20. Oeuvre sp2("l'avare","Moliere" );
  21. Representation rp("12/10/2005","16h00" );
  22. sp.ajouterRepresentation(&rp);
  23. listeSpec.push_back(sp);
  24. listeSpec.push_back(sp2);
  25. listeCli.push_back(cl);
  26. ... // pas besoin du code ici, il s'agit simplement de la gestion d'un menu.
  27. ofstream ecriture("clients_reservations.dat", ios::out );
  28. for ( int i = 0; i < listeCli.size(); i++ )
  29. {
  30.   ecriture << listeCli[i]  // ici il devrait passer dans la redéfinition.
  31. }
  32. return 0;
  33. }
  34. // le fichier Client.h
  35. #ifndef CLIENT_H
  36. #define CLIENT_H
  37. #include <iostream>
  38. #include <fstream>
  39. #include <string>
  40. #include <vector>
  41. #include "Reservation.h"
  42. using namespace std;
  43. class Client
  44. {
  45. private :
  46.   string nom, prenom, adresse, numtel;
  47.   vector <Reservation *> liste;
  48.  
  49. public :
  50.   Client();
  51.   Client ( string, string, string, string );
  52.   Client( const Client & );
  53.   ~Client();
  54.   void modifier();
  55.   virtual void affiche();
  56.   virtual void afficheReservation();
  57.   virtual void ajouterReservation(Reservation *);
  58.   virtual void modifierReservation( int, Reservation * );
  59.   virtual void listeReservation();
  60.   int getNombreReservations();
  61.   virtual void supprimerReservation(int );
  62.   virtual ostream & ecriture ( ofstream & );
  63.   const string getNom();
  64.   const string getPrenom();
  65.   const string getAdresse();
  66.   const string getNumtel();
  67.   void setNom(string);
  68.   void setPrenom(string);
  69.   void setAdresse(string);
  70.   void setNumtel(string);
  71. };
  72. #endif
  73. // la partie utile de Client.cpp :
  74. ostream & Client::ecriture(ofstream & o )
  75. {
  76. return o << nom << "\t" << prenom << "\t";
  77. }
  78. ostream & operator<< (ofstream &o,  Client * c )
  79. {
  80. cout << "passage redef";
  81. return o << c->ecriture( o ) ;
  82. }
 

Si vous pensez avoir besoin d'autres parties de codes n'hésitez pas à me demander.


Message édité par LePhasme le 29-12-2008 à 18:38:36
Reply

Marsh Posté le 03-12-2005 à 20:07:52   

Reply

Marsh Posté le 03-12-2005 à 22:36:11    

la signature doit être
 
ostream& operator<<(ostream&, const T & );

Reply

Marsh Posté le 03-12-2005 à 23:14:22    

En effet, j'ai du rêgler un problème de const suite aux modifs, je ne pensais pas que la forme de cette signature était obligatoire.
 
Merci beaucoup de ton aide.
 
Solution si jamais quelqu'un d'autre est interessé :
 

Code :
  1. // fichier.h  
  2. #ifndef CLIENT_H
  3. #define CLIENT_H
  4. #include <iostream>
  5. #include <fstream>
  6. #include <string>
  7. #include <vector>
  8. #include "Reservation.h"
  9. using namespace std;
  10. class Client
  11. {
  12. private :
  13.   string nom, prenom, adresse, numtel;
  14.   vector <Reservation *> liste;
  15.  
  16. public :
  17.   virtual void listeReservation();
  18.   int getNombreReservations();
  19.   virtual void supprimerReservation(int );
  20.   virtual  ostream & ecriture ( ostream & ) const; // déclarationde la fonction virtuelle
  21. };
  22. inline ostream & operator<< (ostream &o, const Client & c ) // definition de la surcharge
  23. {
  24. c.ecriture(o);
  25. return o ;
  26. }
  27. #endif
  28. // fichier .cpp
  29. ostream & Client::ecriture(ostream & o ) const // définition de la fonction virtuelle
  30. {
  31. return o << nom << "\t" << prenom << "\t" << adresse << "\t" << numtel << "\t" << endl;
  32. }
  33. // main identique a avant, je reposte juste la partie interessante.
  34. for ( int i = 0; i < listeCli.size(); i++ )
  35. {
  36.   ecriture << *listeCli[i];
  37. }
  38. return 0;
  39. }


Message édité par LePhasme le 04-12-2005 à 10:46:16
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed