Nous allons placer dans la classe chaine
à la fois un pointeur sur une chaîne de caractères usuelle (à charge pour la classe de gérer la mémoire occupée par cette chaîne dans le tas), et un entier précisant la longueur de la chaîne, ce qui évite de la recalculer chaque fois. De plus, vu lécriture de f
, il faut un constructeur admettant une chaîne comme paramètre, un constructeur par défaut et un de copie. Un destructeur pour libérer la place prise par la chaîne est également nécessaire. Enfin, on doit avoir une méthode longueur
donnant la longueur de la chaîne, une autre ecrire
qui lécrit à lécran, et une troisième ajoute
qui ajoute une seconde chaîne à la fin et renvoie une référence à la chaîne courante, afin que les appels à cette méthode puissent être chaînés comme on le voit dans f
.
Voici une implantation possible de cette classe :
// utilisation de chaînes #include <iostr.h>#include <string.h>#include <stdlib.h> class chaine { char* p; // chaîne unsigned lg; // longueur de la chaîne public : chaine() { p = 0; lg = 0; } chaine(char *s) { p = strdup(s); if (p) lg = strlen(s); else lg = 0; } chaine(chaine& c) // constucteur de copie { if (c.p) p = strdup(c.p); else p = 0; if (p) lg = c.lg; else lg = 0; } ~chaine() { delete p; } unsigned longueur(void) { return lg; } void ecrire(void) { if (p) cout << p; } chaine& ajoute(chaine&); }; chaine& chaine::ajoute(chaine& c)// ajoute la chaîne c à la fin{ if (!c.lg) return *this; // rien à ajouter if (lg) { char *cp = c.p; char *pp = (char*) realloc(p, lg +c.lg +1); if (pp) { // place mémoire obtenue p = strcat(pp, cp); lg += c.lg; } } else { // chaîne vide au début p = strdup(c.p); if (p) lg = c.lg; } return *this;}
Noter lusage de realloc
dans la méthode ajoute
, qui est impératif ; en effet, strcat
(qui concatène deux chaînes) ne crée pas la place mémoire nécessaire, contrairement à strdup
. Le lecteur vérifie que la fonction ajoute
marche même en cas dajout à soi-même c.ajoute(c)
; cest à cela que sert le pointeur cp
.