Solution de l’exercice 6.3

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 l’usage 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 d’ajout à soi-même c.ajoute(c) ; c’est à cela que sert le pointeur cp.


Retour au texte.