Classe abstraite et operator<<

Classe abstraite et operator<< - C++ - Programmation

Marsh Posté le 27-03-2005 à 00:33:05    

Bonjour,
 
j'ai une classe abstraite Journal :

Code :
  1. class Journal
  2. {
  3.     private:
  4.         virtual void ecrit(const std::string & ) = 0;
  5.     public:
  6.         virtual ~Journal() { }
  7.         template <typename T> Journal &operator<<(T &obj)
  8.         {
  9.             std::ostringstream buffer;
  10.             buffer << obj;
  11.             this->ecrit(buffer.str());
  12.             return *this;
  13.         }
  14. };


 
et une classe qui l'utilise :
 

Code :
  1. class JournalStdErr : public Journal
  2. {
  3.     private:
  4.         void ecrit(const std::string &str)
  5.         {
  6.             std::cerr << str;
  7.         }
  8.     public:
  9.         ~JournalStdErr() { }
  10. };


 
Quand je teste simplement :
 

Code :
  1. int main()
  2. {
  3.     JournalStdErr log;
  4.     log << 1;
  5.     return 0;
  6. }


 
j'ai l'erreur suivante :

Citation :


journal.cc: In function `int main()':
journal.cc:57: error: no match for 'operator<<' in 'log << 1'
journal.cc:17: error: candidates are: Journal& Journal:: operator<<(T& ) [with T = int]


 
Quelqu'un saurait-il où est le problème ? 1 ne serait-il pas un entier ?
Quand j'essaye de faire un cast :

Code :
  1. log << int(1);

j'ai la même erreur...
 
merci pour toute aide
madprog


Message édité par madprog le 27-03-2005 à 00:35:56
Reply

Marsh Posté le 27-03-2005 à 00:33:05   

Reply

Marsh Posté le 27-03-2005 à 01:19:03    

Et si tu fais

Code :
  1. int a = 1;
  2. log << a;


Ca marche ? Pourquoi ?

Reply

Marsh Posté le 27-03-2005 à 03:11:47    

Visual 5 [:rofl]
 
tu sors d'hibernation ? :D
 
sinon pour l'histoire du virtual je crois qu'une fois suffit.

Reply

Marsh Posté le 27-03-2005 à 03:25:01    

Le virus Scheme progresse :)


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 27-03-2005 à 03:29:46    

Tout d'abord merci pour tout :)
Sinon, vous savez pourquoi il faut que je passe par une variable ?

Reply

Marsh Posté le 27-03-2005 à 03:30:57    

le virus Scheme ?

Reply

Marsh Posté le 27-03-2005 à 03:34:16    

Oui c'est quand t'as des parentheses qui commencent a pousser à la place des poils !


Message édité par Chronoklazm le 27-03-2005 à 03:34:56

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 27-03-2005 à 03:36:24    

ah, tiens, ça passe pas non plus avec std::endl...
pourtant, avec un ostringstream ça devrait passer, non ?

Reply

Marsh Posté le 27-03-2005 à 10:08:55    

tu m'explique le coup de la fonction membre virtuelle pure privée ?

Reply

Marsh Posté le 27-03-2005 à 12:02:52    

Taz a écrit :

tu m'explique le coup de la fonction membre virtuelle pure privée ?


Bah, ça gène pas.

Reply

Marsh Posté le 27-03-2005 à 12:02:52   

Reply

Marsh Posté le 27-03-2005 à 12:07:43    

annadivx a écrit :


t'en es ou ? lol...
je vois aussi plein de probs avec les templates...
je suis pas sure qu'un (int) puisse vraiment instancier un class<int>...
 
je n'y crois pas trop ;)
je suis en train de le faire pour me remettre ds le bain,...
je suis restée trop théorique ces dernières années :(
 
P.S.
Quand on commence trop de phrases avec un 'je' on a un gage ?


Non, par contre, il y a des languages, comme le VB ( :ange: ) qui permettent de faire un :

With je
    vois aussi plein de probs avec les templates...
    suis pas sûre qu'un (int) puisse vraiment instancier un class<int>...
    [...]
EndWith


* prend calmement la direction de la porte : =>[] *

annadivx a écrit :


 

Code :
  1. #include "iostream.h"
  2. template<typename T> class Journal
  3. {
  4.     private:
  5.         virtual void ecrit(const std::string &oui_on_est_oblige_de_mettre_une_variable) = 0;
  6.     protected: // ça laisse la porte ouverte à presque toutes les fenêtres...
  7.         std::ostream *buffer;


Je vois pas trop à quoi sert le ostream ici, vu que rien n'oblige à priori d'écrire un log dans un fichier : on peut l'afficher directement à l'écran (dans une interface type SDL), ou dans des MsgBox (si jamais mon code arrive sous windows), etc.

annadivx a écrit :

Code :
  1. public:
  2.         Journal(std::ostream *buffer_) : buffer(buffer_) {};
  3.         virtual ~Journal<T>() {};
  4.         Journal<T> & operator<<(T obj)
  5.         {
  6.      // this->ecrit(buffer->str()); // ??-keskidi ?
  7.      // Je vois pas bien ce que tu veux lui passer... ?
  8.      this->ecrit("quoi de neuf?" );
  9.             *buffer << obj;
  10.     this->ecrit("\n" ); // std::endl n'est pas compatible...


Comme je le voyais partout, je pensais qu'il était compatible avec tous les streams de la stl...

annadivx a écrit :

Code :
  1. return *this;
  2. };
  3. };
  4. template<typename T> class JournalStdErr : public Journal<T>
  5. {
  6.     private:
  7. virtual void ecrit(const std::string &str)
  8.         {
  9.             *buffer << str; // la fenêtre...
  10.     cerr << str; // le jacousi...
  11.         };
  12.     public:
  13.         JournalStdErr<T>(std::ostream *buffer_) : Journal<T>(buffer_) {};
  14.         virtual ~JournalStdErr() {}
  15. };
  16. template<typename T> class JournalDeBord : public JournalStdErr<T>
  17. {
  18.     private:
  19.         virtual void ecrit(const std::string &str)
  20.         {
  21.             *buffer << "(* LOWEST "<< str << " *)"; // la fenêtre...
  22.     cerr << str; // le jacousi...
  23.         };
  24.     public:
  25.         JournalDeBord<T>(std::ostream *buffer_) : JournalStdErr<T>(buffer_) {};
  26.         virtual ~JournalDeBord() {}
  27. };
  28. int main()
  29. {
  30.     std::ostream *q = &cout;
  31.     Journal<int> *log = new JournalStdErr<int>(&cout);
  32.     (*log) << 1 << 2 << 3;
  33.     // on va pas très loin avec '<<' defini comme ça...
  34.     Journal<float> *nlog = new JournalDeBord<float>(&cout);
  35.     (*nlog) << 4.0 << 5.0 << 6.0;


C'est ici que je te repproche d'avoir à initialiser un journal par type (un pour les int, un pour les float), alors que le but serait de pouvoir écrire dedans comme dans cerr ou dans cout

annadivx a écrit :

Code :
  1. cout << "fin" << std::endl;
  2.     return 0;
  3. }; // main


 
bon...
 
Mais il y avait pas mal d'erreur sémantique avec les "templates"...
 
Quelle était l'intention de départ ?
 
P.S.
Z'êtes des couche tôt ici ;)


On m'a dit que dormir la nuit contribuait à avoir une vie sociale... Maie je te dirais si c'est vrai : pour l'instant je rencontre plus de monde sur internet que irl...

Reply

Marsh Posté le 27-03-2005 à 12:19:24    

sinon, avec le code suivant :

Code :
  1. log.operator << (1);


j'ai toujours une erreur :

Citation :


journal.cc: In function `int main()':
journal.cc:58: error: no matching function for call to `Journal:: operator<<(int
   )'
journal.cc:17: error: candidates are: Journal& Journal:: operator<<(T& ) [with T  
   = int]


Si on m'avouait que 1 n'est pas un int...
 
Mais en fait, je viens de m'apercevoir que je demande une référence vers T.
Or je passe une référence non constante vers une constante...
 
Effectivement, avec ça, ça marche :

Code :
  1. template <class T> Journal &operator<<(const T &obj)
  2. {
  3.     std::ostringstream buffer;
  4.     buffer << obj;
  5.     this->ecrit(buffer.str());
  6.     return *this;
  7. }


 
Désolé du dérangement...
Pour la source du journal, allez voir sur http://htkc.org/journal.cc


Message édité par madprog le 27-03-2005 à 12:20:55
Reply

Marsh Posté le 27-03-2005 à 16:49:27    

verdoux a écrit :

Bah, ça gène pas.


ça ne me l'explique toujours pas

Reply

Marsh Posté le 28-03-2005 à 10:02:43    

pour rebondir sur la remarque dand le code de annadivx, ej citerais mon défuitn prof de C++ :
 
"virtual un jour, virtual toujours :o"

Reply

Marsh Posté le 28-03-2005 à 11:21:54    

Joel F a écrit :

pour rebondir sur la remarque dand le code de annadivx, ej citerais mon défuitn prof de C++ :
 
"virtual un jour, virtual toujours :o"


Même dans le constructeur ?  :whistle:

Reply

Marsh Posté le 28-03-2005 à 11:54:39    

annadivx a écrit :

ça n'a pas de signification pour les constructeurs...
on ne peux qu'invoquer un constructeur, depuis un autre constructeur.
et tous n'auront jamais que le nom de la classe qu'ils "construisent" ;)
 
Ce sont les destructeurs qui doivent être virtuels (ou non) selon que la classe est virtuellement dérivée (ou non),...
(situation d'héritage multiple)
 
Je confirme que selon la situation architecturale que l'on souhaite (avec héritage multiple) , il peut être nécessaire que certains destructeurs ne soit pas virtualisés.
 
- à vérifier par soi-même :) -


Je n'ai pas dit: "Même le constructeur ?".  
J'ai dit: "Même dans le constructeur ?". :)

Reply

Marsh Posté le 28-03-2005 à 12:11:56    

annadivx a écrit :

Je ne vois pas ce qui peut être "virtuel un jours, virtuel toujours..." dans le constructeur... ?
ça m'intéresse :)
 
[:annuegypte] il y a un piège ?
 
hihi


 
C'est quoi qu'on construit ? Une poule ou un oeuf ?

Code :
  1. #include <iostream>
  2. struct Oeuf
  3. {
  4.   Oeuf()
  5.      { Decrit();  }
  6.   virtual void Decrit()
  7.      { std::cout << "Je suis un Oeuf." << std::endl; }
  8. };
  9. class Poule : public Oeuf
  10. {
  11.   virtual void Decrit()
  12.      { std::cout << "Je suis une Poule." << std::endl; }
  13. };
  14. int main()
  15. {
  16.   Poule p;
  17. }


Message édité par Lam's le 28-03-2005 à 12:12:25
Reply

Marsh Posté le 28-03-2005 à 12:34:59    

annadivx a écrit :

Je ne vois rien de virtuel la dedans...


Tu m'inquiètes là. Tu vois bien le mot "virtual" devant la méthode Decrit() ?  
 
Si oui, on pourrait naïvement s'attendre à ce que le compilo aille piocher la bonne méthode Decrit (en utilisant de la magie ou une vtable, au choix) et nous affiche donc fièrement que l'objet pense qu'il est une Poule ?  
 
C'était là le but de mon commentaire taquin (que JoelF aura compris): une méthode virtuelle un jour, est virtuelle toujours, mais seulement après construction.

Reply

Marsh Posté le 28-03-2005 à 13:26:52    

Je parlauis dans les declarations de class Lam's :)

Reply

Marsh Posté le 28-03-2005 à 14:14:22    

annadivx, tu bosses en root ?

Reply

Marsh Posté le 28-03-2005 à 14:31:40    

annadivx a écrit :

je suis chez moi, je fais ce que je veux... ;)
et surtout je sais ce que je fais.
 
sur Solaris (Sun Blade), MacOSX (2*Titanium et 2* PowerBook G3 << Pismo >> ), un serveur Dell/RedHat. un serveur Multimedia avec Ubuntu (dérivée de Debian), plus un vieux G3/iMac pas dommage...
 
Mais je ne travaillais jamais sous 'root' (sauf demande clients) en Entreprise, ni dans les écoles (c'est pas nécessaire). Je travaillais aussi sur des Vax/11-780 (VMS), des IBM/36/38/400 plus des gros mainframe IBM/Hitachi/Bull/ dont certains avec AIX (Unix d'IBM), MVS/TSO/CICS et aussi sur des Univacs, un Pr1me, etc...
 
Sur un MacOSX qui m'appartient,
je travail toujours sous 'root'...
 
:)


 :love:  :love:  :love:


---------------
[:whatde]
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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