Bonjour,
alors voilà, un jour j'ai créé une petite classe pour ajouter une en-tête (un string) à un ostream quelconque. Je me suis aidé d'un exemple du web et tout fonctionnait bien.
Voila le post associé Ajouter une en-tete à un ostream
Le code du dernier message résume la solution adoptée.
Puis récemment, je me suis dit que ça serait bien que je comprenne un petit peu le fonctionnement exact de tout ca, parce que cela me dépassait largement à l'époque (et je m'aperçois d'ailleurs que c'est toujours le cas).
En réalité, ce que fait principalement le code, c'est d'encapsuler un streambuf existant (celui de std::cout par exemple) en tant que donnée membre d'un nouveau streambuf custom (CMyStreambuf derivé de streambuf) créé pour l'occasion.
1ere question : Est-ce la mise en oeuvre classique de la technique que l'on appelle "pattern decorator" ? Si oui, est-ce fait dans les règles de l'art ?
Le constructeur de CMyStreambuf precise bien setp(0,0).
2ème question : Si je comprends bien, on ne positionne les pointeurs du streambuf sur rien du tout, cela implique donc qu'aucun buffer ne sera utilisé ?
3ème question : Dans ce cas, je suppose (encore) que la fonction overflow sera appelée pour chaque nouveau caractère reçu dans le streambuf custom... Correct ? N'est-ce pas un peu inefficace d'appeler une fonction (virtuelle qui plus est) pour chaque caractère ? Je suppose que le débat fait deja rage pour tous les streams non bufferisés...
En fait, si je me pose ces questions, c'est que je tique un peu sur le fait d'encapsuler le streambuf existant dans un nouveau; pour ensuite appeler dans l'overflow de ce dernier (non bufferisé), les "sputc" de celui encapsulé. Est-ce vraiment quelque chose à faire ?
N'aurait-il pas été plus direct (malin ?) de creer un streambuf custom (CMyStreambuf) qui redéfinit overflow (jusque la pas de souci) mais qui, au lieu d'encapsuler un streambuf en donnée membre, serait initialisé par le constructeur par recopie (hérité de streambuf) auquel on passerait le streambuf a modifier ?
En une phrase, "copier le streambuf de base dans une classe dérivée ou l'on a redefinit l'overflow" ?
Or je ne trouve pas de constructeur par recopie dans streambuf... J'ai vu des "basic_streambuf" à la place mais je ne comprends pas vraiment...
Derniere chose, dans le code d'exemple, lorsque l'on definissait une classe dérivée de ostream, on precisait, dans le constructeur : ios(0). Donc l'appel du constructeur de base de ios ? Est-ce utile d'appeler celui-ci et aussi celui de ostream comme dans le code ?
Merci de votre aide et de vos remarques, j'avoue que ca fait quelques jours que j'essaye de lire plein de choses la dessus et que j'ai l'impression de nager dans une soupe ou tout le monde fait "comme il peut"... Et j'aime pas ça.
Bouteille.
Partager