 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Christophe Lephay Guest
|
Posted: Tue Jul 22, 2003 5:57 pm Post subject: Re: heritage ostream |
|
|
"frederic blain" <blainfr (AT) wanadoo (DOT) fr> a écrit dans le message de
news:20030722192614.5c1e6d18.blainfr (AT) wanadoo (DOT) fr...
| Quote: | J'ai cependant la necessite de detecter la fin d'une sequence
d'operateurs <<, afin de pouvoir emettre le bon message dans
syslog.
log << "hello" << "world";
^^^
fin de sequence
J'ai donc intergre une enum pour pouvoir faire :
log << "hello" << "world" << Log::eom
^^^^^^^^
mon enum
en rajoutant une methode
Log::operaor<< (enum e_end_message);
Cependant cela ne fonctionne que dans le seul cas ou mon enum est en
premiere position, ce qui est normal. (le stream renvoye est celui
de ostream, et non celui de ma classe dans les autres cas)
Si quelqu'un saurait comment resoudre mon probleme ou aurait une autre
solution pour detecter la fin d'une sequence
|
tu peux peut-être passer par la création d'un temporaire, qui sera détruit à
la fin de l'expression :
class Eom
{
Log * log
public:
Eom() : log( null ) {}
~Eom()
{
if( log )
*log <<("fin de séquence");
}
friend class Log;
};
Log& Log::operaor<< ( Eom& eom )
{
eom.log = this;
return *this;
}
....
log << "hello, " << Eom() << "World !";
Eom crée un objet temporaire qui sera détruit à la fin de l'instruction...
Chris
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Jul 22, 2003 6:00 pm Post subject: Re: heritage ostream |
|
|
frederic blain <blainfr (AT) wanadoo (DOT) fr> writes:
| Quote: | Cependant cela ne fonctionne que dans le seul cas ou mon enum est en
premiere position, ce qui est normal. (le stream renvoye est celui
de ostream, et non celui de ma classe dans les autres cas)
|
3 solutions:
1/ tu définis un operator<<(osteam&, enum)
dans lequel tu fais un dynamic_cast
2/ tu définis une fonction eom(ostream&) qui fait ce que tu ferais
dans l'operator<< (donc dynamic_cast etc...) et tu l'utilises à la
place de l'enum
3/ tu utilises la durée de vie des temporaires et tu fais
Log() << "hello" << " world";
et le destructeur de Log fait ce qu'il faut.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Wed Jul 23, 2003 9:29 am Post subject: Re: heritage ostream |
|
|
Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> wrote
| Quote: | frederic blain <blainfr (AT) wanadoo (DOT) fr> writes:
Cependant cela ne fonctionne que dans le seul cas ou mon enum est en
premiere position, ce qui est normal. (le stream renvoye est celui
de ostream, et non celui de ma classe dans les autres cas)
3 solutions:
1/ tu définis un operator<<(osteam&, enum)
dans lequel tu fais un dynamic_cast
2/ tu définis une fonction eom(ostream&) qui fait ce que tu ferais
dans l'operator<< (donc dynamic_cast etc...) et tu l'utilises à la
place de l'enum
3/ tu utilises la durée de vie des temporaires et tu fais
Log() << "hello" << " world";
et le destructeur de Log fait ce qu'il faut.
|
J'utilise prèsqu'exclusivement la solution 3. La plupart du temps,
j'utilise un « wrapper », afin que l'objet Log puisse être renvoyé d'une
fonction -- l'objet pourrait par exemple dépendre du fichier de
configuration, etc. (L'important, dans ce cas-là, c'est qu'on ne sait
pas a priori combien de temporaires intermédiaire il va y avoir. On les
compte donc, et on fait le traitement de fin quand le dernier est
detruit.)
J'ai une implementation générique (GB_OutputStreamWrapper) à ma site,
mais c'est peut-être un peu trop pour des cas simple. En revanche, en le
combinant avec GB_EventGeneratingOutputStream, on arrive à une gestion
de log extrèmement souple (mais complex, et qui ne se justifie que dans
des applications vraiement grandes).
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|