C++ : Création d'une bibliothèque de chaînes de caractères

Mettre en place la classe de découpage

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Mettez en œuvre l'injection de dépendance. Il s'agit d'encapsuler au mieux les résultats du découpage d'une chaîne.

Transcription

Dernière étape dans l'écriture de ma classe chaîne, la fonction de découpage. Cette opération de découpage n'est pas difficile en elle-même, mais elle est particulière, puisqu'après avoir découpé, ce que l'on obtient, ce n'est pas une chaîne, comme toutes les autres opérations, mais une collection de chaînes. Ici, j'ai choisi de prendre une classe spécifique, d'en écrire une spécifique qui est la classe Decoupage, qui se trouve dans Chaine, d'où le Chaine::Decoupage. Cette classe va contenir une collection de chaînes, et elle peut être parcourue par une boucle for, ici un for each, l'équivalent du for each en C++11, qui me permet de parcourir chaque élément de cette collection et après d'en afficher le contenu, ici, puisque c'est une chaîne, mais aussi de comparer à un tableau de référence qui est attendu, ici, qui est mes valeurs attendues, « Lundi », « Mardi », si je découpe bien, j'ai bien les jours de la semaine qui ne sont plus séparés par des virgules, puisqu'ils sont dans la collection résultat du découpage. Cette classe Decoupage, on va aller la voir, dans Chaine.h, elle est ici. Et donc cette classe Decoupage est particulière, puisqu'elle est abstraite. On a deux méthodes, qu'on appelle virtuelles pures, elles n'ont pas de code, et ces deux méthodes permettent le parcours, puisqu'elles ont begin et end, c'est ce qu'exige le for each du C++11, que la classe possède deux méthodes begin et end pour parcourir le contenu. Ce qui est largement suffisant pour la personne qui a demandé le découpage, puisqu'elle pourra parcourir le résultat, mais par contre, ce qui ne va pas nous satisfaire pour produire la collection. Pourquoi avoir pris une classe abstraite ? Tout simplement parce que cette classe Decoupage est publique, donc je ne veux pas que le reste du programme utilise les spécificités de mon implémentation, et donc je lui expose juste l'interface qui l'intéresse, c'est à dire Decoupage. Et je vais produire, mais en privé, une classe qui est l'implémentation de cette classe Decoupage, donc ici, je dérive cette classe Decoupage, et je fais une classe Decoupage_Impl, qui possède des méthodes supplémentaires pour créer ma collection. Comme elle est privée, elle n'est utilisable que par ma classe Chaine. Cette astuce est appelée une injection de dépendance : j'ai, pour éviter toute dépendance de mon programme à mes détails et spécificités d'implémentation internes, j'ai proposé une interface simple, une coquille vide, avec juste l'interface qui intéresse le reste du programme, et j'ai fait mon implémentation par un héritage que j'ai masqué en le mettant en privé. Voilà le principe de l'injection de dépendance. decouper va, bien sûr, créer un Decoupage_Impl et le remplir. Je vais maintenant aller dans le Chaine.cpp, écrire ma classe. Alors, le decouper est vide pour l'instant, je le compléterai, mais je vais aussi écrire ma classe, alors je vais commencer à l'écrire, ici, j'ai collé du code qui permet d'implémenter cette classe, vous voyez, dans un premier temps, très simple, le constructeur ne fait rien de spécial, puisque j'ai, à l'intérieur, fait le choix de prendre un vector de Chaine, et donc le vector va être un tableau vide, à la création de ma classe. Ensuite, je vais juste appeler le begin de mon vector pour assurer le begin de mon implémentation, et je vais aussi appeler le end du vector pour faire le end de mon implémentation. Comme ça, les deux méthodes virtuelles pures, qui sont dans Decoupage, je vous rappelle, elles sont là, sont maintenant implémentées au travers de l'appel indirect à begin et end du vector. Donc implémentation somme toute très simple. La suivante, c'est celle du add, puisque mon découpage, quand il se fera, aura besoin de créer la collection et d'ajouter des éléments, donc là, si je reçois une chaîne de caractères C, sa taille, et donc j'utilise le constructeur qu'on a vu précédemment, qui prend une taille en paramètre, qui est privé mais j'y ai accès depuis mes classes internes. Et donc je fais cette chaîne, je recopie, avec un strncpy, pour des raisons de sécurité, je ne copie que la taille qu'on m'a demandée, et puis je rajoute un zéro terminal, ici, et donc je crée une chaîne de toutes pièces, qui va être une extraction de la chaîne qu'il y a dans la chaîne de référence et que je suis en train de découper. Enfin, je déplace cette chaîne créée localement, par un move, pour ne pas perdre de temps par une copie inutile, puisque j'ai implémenté la sémantique de déplacement, j'utilise le move pour remplir mon vector avec la méthode classique, le push_back. Donc j'ai ma collection qui va s'enrichir au fur et à mesure des add, des différentes chaînes et extractions que je fais dans la chaîne originale. Je vais maintenant m'intéresser au découpage, donc je remonte ici, puisque maintenant, j'ai ma classe d'implémentation. Alors, ici, pour commencer à découper, qu'est-ce que je fais ? Je crée déjà ma collection, ici, dynamiquement, puisque je dois retourner un pointeur unique sur un découpage. Donc je crée dynamiquement ma collection. Et ensuite, je mesure la taille du séparateur, juste pour des raisons pratiques, comme ça je n'aurai pas à le refaire plusieurs fois, après, dans la boucle. Et puis, je démarre du début de ma chaîne, avec val.get, je me mets au début, cur c'est le début de ma chaîne, la première occurrence du séparateur, je considère au début qu'elle est au début de ma chaîne, puisque je ne sais pas à l'avance, puis tant que je trouve des occurrences, ça c'est le tant que de mon for, c'est-à-dire la condition qui va me permettre de continuer ma boucle for, tant que je trouve des occurrences, je progresse d'occurrence en occurrence, en sautant les séparateurs, donc occurrence + nsep. Alors, qu'est-ce que je vais faire dans cette boucle ? Déjà, je peux savoir que je vais retourner ma collection, donc je fais un pointeur unique sur ce que j'ai alloué tout à l'heure, donc res, ici. Et maintenant, il faut que je détermine les occurrences de mon séparateur, pour ça, je vais utiliser un strstr, ici, je pars de l'endroit où je suis, et puis je cherche un séparateur, avec strstr, et il me donne l'occurrence, et cette occurrence, je vais pouvoir l'ajouter si elle est non nulle, car si elle est nulle, il faut que je prenne toute la taille restante, ici. Donc occurrence vaut soit non nul, si j'ai trouvé une occurrence, auquel cas, je prends ça, et je demande à extraire avec mon add, puisqu'on a vu que le add permettait une extraction ; soit je n'ai pas d'occurrence, et donc c'est nul, et donc je vais passer là-dessus où je prends taille, qui est la taille totale de ma chaîne, et moins la position courante. Je sauvegarde, et je peux exécuter pour vérifier mes tests. Notre classe chaîne est maintenant très complète, avec le découpage, et nous avons pu voir, au détour de son implémentation, l'ensemble de bonnes pratiques, on l'a vu ici avec l'injection de dépendance, qui vous serviront pour la création de vos propres classes.

C++ : Création d'une bibliothèque de chaînes de caractères

Acquérez les méthodes de développement en C++ avec la création de bibliothèques de chaînes de caractères personnalisées. Abordez les constructeurs, les structures de données, etc.

45 min (10 vidéos)
Aucun commentaire n´est disponible actuellement
 
Logiciel :
Spécial abonnés
Date de parution :24 oct. 2016

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !