surcharge operator<<

surcharge operator<< - C++ - Programmation

Marsh Posté le 05-07-2005 à 18:52:34    

J'essaye desesperemment de creer une classe qui agisse comme std::cout.
 

Code :
  1. class Logger {
  2. public:
  3. enum Level {
  4.  Debug,
  5.  Info,
  6.  Warn,
  7.  Error,
  8.  Fatal
  9. };
  10. Logger() {
  11. }
  12. void operator<<(std::ostream & os) {
  13.  std::ostringstream ostr;
  14.  ostr << os;
  15.  log(Level::Debug, ostr.str());
  16. }
  17. friend std::ostream & operator<<(std::ostream & os, Logger & logger) {
  18.  return os;
  19. }
  20. void log(Level level, const std::string & message) {
  21.  ...
  22. }
  23. };


 
Je voudrais obtenir ceci comme syntax:
 

Code :
  1. Logger logger;
  2. logger << "erreur blabla: " << x << y;
  3. //syntax moins sympa que je voudrais eviter:
  4. logger.log(Level::Debug, "erreur blabla: " + itoa(x) + itoa(y));


 
J'ai essaye pas mal de trucs et je comprends pas comment surcharger l'operator<< pour que Logger fonctionne comme un ostream (j'ai aussi essaye l'heritage et je n'y arrive pas non plus).
Si quelqu'un maitrise les iostreams je lui en serai reconnaissant !

Reply

Marsh Posté le 05-07-2005 à 18:52:34   

Reply

Marsh Posté le 05-07-2005 à 19:46:18    

ça manque de const tout ça. vire tes itoa. pas standard, UB avec ton utilisation.

Reply

Marsh Posté le 05-07-2005 à 19:46:42    

et fais une recherche sur forum, on a déjà donné des exemples de manipulation et autre trucs

Reply

Marsh Posté le 05-07-2005 à 19:59:51    

Code :
  1. #include <iostream>
  2. using namespace std;
  3. struct Foo{};
  4. class FooBinaryWriter
  5. {
  6. public:
  7.   explicit FooBinaryWriter(const Foo &f):
  8.     foo(f)
  9.   {}
  10.   inline ostream & operator()(ostream &os) const
  11.   {
  12.     os <<  " *** j\'ecris *** ";
  13.     // et des trucs binaires avec os.write
  14.     // cette classe peut être amie de Foo
  15.     return os;
  16.   }
  17. private:
  18.   const Foo &foo;
  19. };
  20. ostream& operator<<(ostream &os, const FooBinaryWriter &fbw)
  21. {
  22.   return fbw(os);
  23. }
  24. inline FooBinaryWriter FBW(const Foo &f)
  25. {
  26.   return FooBinaryWriter(f);
  27. }
  28. class Log
  29. {
  30. public:
  31.   Log():
  32.     os(0)
  33.   {}
  34.  
  35.   inline void bind(ostream *o) const
  36.   {
  37.     os=o;
  38.     header();
  39.   }
  40.   void header() const
  41.   {
  42.     *os << "Beginning of message *** ";
  43.   }
  44.   void footer() const
  45.   {
  46.     *os << " *** End of message" << endl;
  47.   }
  48.   ~Log()
  49.   {
  50.     footer();
  51.   } 
  52. private:
  53.   mutable ostream *os;
  54. };
  55. ostream& operator<<(ostream &os, const Log &l)
  56. {
  57.   l.bind(&os);
  58.   return os;
  59. }
  60. inline ostream& hello(ostream &os)
  61. {
  62.   os << "Hello World!\n";
  63.   return os;
  64. }
  65.  
  66. int main()
  67. {
  68.   Foo f;
  69.   cout << "Hello" << FBW(f) << "world" << endl;
  70.   cout << Log() << "message = " << 3.141516 << "\tbye";
  71.   cout << hello;
  72. }

j'ai retrouvé ça, c'est une bonne piste pour débuter

Reply

Sujets relatifs:

Leave a Replay

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