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.
Précédent | Sommaire | Suivant |