Date de première publication : 2012/10/12
Raconter des histoires aux enfants est un véritable métier. Nous vous proposons de coder un outil en C++ pour aider un conteur à trouver parmi tous les contes qu’il connaît ceux où apparaît tel ou tel personnage (toutes les histoires de « loup » par exemple).
Le code devra être écrit pour minimiser la copie d'objets et respecter au maximum la constance des objets. Il faut préciser également les entêtes à inclure pour chaque objet prédéfini et la manière d'y accéder.
- Créer une classe
Personnage
qui a unnom
(attribut privé nom de type chaîne de caractères), gentil ou méchant (avec un booléen) et plus ou moins intelligent. Mettre un constructeur public qui permet d'initialiser cet attribut avec une liste d'initialisation. Pour les autres attributs, mettre des valeurs par défaut. On veut ne pas avoir la possibilité de créer de Personnage avec un nom par défaut.
Sur une échelle de 0 à 10, le loup des trois petits cochons aura une intelligence de 5 (valeur par défaut) et les trois petits cochons, respectivement 3, 5 et 9.
- Créer une classe
Animal
qui dérive de Personnage et qui permet d'initialiser le nom. Par défaut, tous les animaux auront la capacité de parler.
- Créer une classe Conte avec un constructeur qui permet d'initialiser le nom du Conte. Cette classe doit pouvoir stocker des pointeurs sur des objets de la classe Personnage. Vous utiliserez un conteneur de la stl.
- Choisir un conteneur : std::list ou std::vector par exemple
- Outre le constructeur, il faut un destructeur qui rend la mémoire allouée pour les personnages (explicitement demandé à la question suivante)
- Écrire le code nécessaire pour réaliser les tâches suivantes :
Conte tpc("trois petits cochons");
tpc.add(new Animal("loup"));
Conte pcr = tpc;
pcr.setNom("petit chaperon rouge");
cout << tpc << endl;
cout << pcr << endl;
La redirection d'une instance de Conte
sur un flux affiche le nom du conte ainsi que le nom des différents personnages.
Les personnages d'un conte sont dupliqués si un conte est dupliqué. Aucune fuite mémoire ne peut être acceptée.
- Ligne 1 : déjà écrite
- Ligne 2 : doter la classe
Conte
d'une méthodeadd()
- Ligne 3 : doter
Personnage
d'un constructeur de recopie - Ligne 4 : doter
Conte
de getter et setter sur l'attributnom
- Ligne 5 : ajouter des opérateurs << sur des objets
Personnage
etConte
- Compléter le destructeur de
Conte
si cela n'a pas été encore fait. - Pour dupliquer les personnages, il faut FAIRE UNE METHODE SPECIALE
-
On veut vérifier que l'instance d'Animal a bien été dupliquée par l'instruction :
cout << Personnage::getCompteur();
Donner les modifications à apporter (et où) pour prendre en compte ce besoin.
- Définir une méthode decrire() pour la classe Personnage. Cette méthode permet d'afficher les propriétés des personnages sur un flux donné en paramètre. Bien entendu, cette méthode devra être redéfinie dans les sous-classes de Personnage.
- Comment rendre la classe Personnage abstraite ? Comment limiter la duplication de code dans les classes filles ?
- Écrire la classe Humain. Un Humain est un Personnage : garçon ou une fille et peut avoir un âge stocké dans une énumération : JEUNE, ADO, ADULTE, VIEILLARD.
- On veut maintenant traiter le cas d’un Monstre qui un mélange subtil d'Humain et d'Animal. Quel concept faut-il utiliser et comment permettre l’exécution du code suivant en ne créant qu'une seule instance de Personnage pour la "Bete" ? Si vous devez modifier du code écrit précédemment, veuillez juste donner les modifications.
Conte bb("la Belle et la Bete");
bb.add(new Humain("Belle"));
bb.add(new Monstre("Bete"));
On connaît l'apparence d'un Monstre : COMIQUE, MIGNON, INSIGNIFIANT, TERRIFIANT (à définir dans une énumération).
- Créer une classe Conteur qui mémorise des pointeurs sur des Conte et stocke un index des noms de personnages avec le conte associé. L'index sera une multimap associant une chaîne de caractères avec un pointeur sur le conte concerné. Le conteur aura également un nom défini à l'instanciation.
- Implémenter une méthode pour créer l'index à partir de la liste des contes.
- Implémenter une méthode qui permet d'afficher l'index sur un flux donné préférentiellement avec un algorithme de la STL.
- Implémenter une méthode qui affiche tous les contes où un personnage donné par son nom apparaît.