Nous avons dit quil nest pas possible décrire une assignation dune instance de ostream vers une autre, et quil en est de même pour istream et iostream.
Les classes ostream_withassign, istream_withassign et iostream_withassign se distinguent de leur homologues en ce que lopérateur daffectation y est redéfini. On peut ainsi affecter un ostream à une instance de ostream_withassign, etc.
Voici par exemple comment est définie ostream_withassign :
class ostream_withassign : public ostream { public: ostream_withassign(); virtual ~ostream_withassign(); ostream_withassign& operator= (ostream&); ostream_withassign& operator= (streambuf*);}; Le constructeur par défaut ne fait rien ; lopérateur daffectation avec un argument streambuf* est sensiblement identique au constructeur équivalent de ostream.
Si ces classes existent, cest que cest généralement une erreur de recopier un flot dans un autre : en particulier, si deux flots partagent le même fichier sur disque, des dégâts risquent de survenir. Le fait de déclarer un flot _withassign indique clairement que lon souhaite faire une telle copie. Cela ne pose pas de problèmes avec les flots prédéfinis, qui sont au nombre de quatre :
ostream_withassign cout | Comme on le sait déjà, ce flot envoie ses sorties à lécran. |
istream_withassign cin | Ce flot prend ses entrées au clavier. |
ostream_withassign cerr | Flot derreur. Par défaut identique à cout. |
ostream_withassign clog | Flot derreur mais avec un tampon. |
Il est parfaitement possible de modifier ces flots. Par exemple, pour envoyer les messages derreur vers un fichier error.msg, il suffit décrire :
ofstream ferr("ERROR.MSG");if (ferr) // si on a pu ouvrir le fichier... cerr = ferr; Les classes _withassign occupent la même place mémoire que leurs homologues de base.
| Suivant |