Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
674 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Classe abstraite et operator<<

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Classe abstraite et operator<<

n°1026525
madprog
Posté le 27-03-2005 à 00:33:05  profilanswer
 

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
mood
Publicité
Posté le 27-03-2005 à 00:33:05  profilanswer
 

n°1026554
verdoux
And I'm still waiting
Posté le 27-03-2005 à 01:19:03  profilanswer
 

Et si tu fais

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


Ca marche ? Pourquoi ?

n°1026584
push
/dev/random
Posté le 27-03-2005 à 03:11:47  profilanswer
 

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

n°1026590
Chronoklaz​m
Posté le 27-03-2005 à 03:25:01  profilanswer
 

Le virus Scheme progresse :)


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°1026593
madprog
Posté le 27-03-2005 à 03:29:46  profilanswer
 

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

n°1026594
madprog
Posté le 27-03-2005 à 03:30:57  profilanswer
 

le virus Scheme ?

n°1026596
Chronoklaz​m
Posté le 27-03-2005 à 03:34:16  profilanswer
 

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 !
n°1026598
madprog
Posté le 27-03-2005 à 03:36:24  profilanswer
 

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

n°1026627
Taz
bisounours-codeur
Posté le 27-03-2005 à 10:08:55  profilanswer
 

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

n°1026670
verdoux
And I'm still waiting
Posté le 27-03-2005 à 12:02:52  profilanswer
 

Taz a écrit :

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


Bah, ça gène pas.

mood
Publicité
Posté le 27-03-2005 à 12:02:52  profilanswer
 

n°1026671
madprog
Posté le 27-03-2005 à 12:07:43  profilanswer
 

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...

n°1026678
madprog
Posté le 27-03-2005 à 12:19:24  profilanswer
 

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
n°1026816
Taz
bisounours-codeur
Posté le 27-03-2005 à 16:49:27  profilanswer
 

verdoux a écrit :

Bah, ça gène pas.


ça ne me l'explique toujours pas

n°1027131
Joel F
Real men use unique_ptr
Posté le 28-03-2005 à 10:02:43  profilanswer
 

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

n°1027168
Lam's
Profil: bas.
Posté le 28-03-2005 à 11:21:54  profilanswer
 

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:

n°1027193
Lam's
Profil: bas.
Posté le 28-03-2005 à 11:54:39  profilanswer
 

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 ?". :)

n°1027201
Lam's
Profil: bas.
Posté le 28-03-2005 à 12:11:56  profilanswer
 

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
n°1027217
Lam's
Profil: bas.
Posté le 28-03-2005 à 12:34:59  profilanswer
 

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.

n°1027260
Joel F
Real men use unique_ptr
Posté le 28-03-2005 à 13:26:52  profilanswer
 

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

n°1027314
madprog
Posté le 28-03-2005 à 14:14:22  profilanswer
 

annadivx, tu bosses en root ?

n°1027328
WhatDe
Posté le 28-03-2005 à 14:31:40  profilanswer
 

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]
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Classe abstraite et operator<<

 

Sujets relatifs
[java] Classe abstraite, polymorphisme et tableau[JSP] Accéder à une classe
[Java] classe de gestion de fichier .ini à disposition par ici[c++] classe et typedef
Problème de syntaxe sur une classeappel d'un objet d'une autre classe dans une classe
action listener d'un bouton utilisé dans une autre classe[CSS] Pseudo-classe :first-letter ne fonctionne pas sous IE6
Classe Lecture 
Plus de sujets relatifs à : Classe abstraite et operator<<


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR