C++ : Sujet du TP5 C++ : Sujet du TP5
Groupe ESIEE, Denis BUREAU, décembre 2000.
Remarque préliminaire
Pour tous les programmes ci-dessous, utiliser des fichiers séparés pour la déclaration de la classe, pour la définition des fonctions membres, et pour l'application utilisatrice de la classe.

1  Le polymorphisme (sans rapport avec le distributeur)

1a  La classe de base : nombre

Déclarer une classe ayant pour seule donnée membre un entier valeur, et comme fonctions membres une fonction d'affichage aff ainsi qu'une autre fonction d'affichage dynaff virtuelle pure.

Définir la fonction aff pour qu'elle affiche simplement la valeur entre deux parenthèses.

1b  La classe binaire

Déclarer une sous-classe binaire ne comportant pas d'autre donnée membre spécifique, mais le constructeur à un argument entier, la fonction dynaff et la fonction aff.

Définir la fonction dynaff pour qu'elle affiche "binaire:" puis la valeur. La fonction aff appellera simplement dynaff. Le constructeur devra stocker uniquement 0 ou 1 (par exemple, la parité).

1c  La classe chiffre

Déclarer une sous-classe chiffre ne comportant pas d'autre donnée membre spécifique, mais le constructeur à un argument entier, la fonction dynaff et la fonction aff.

Définir la fonction dynaff pour qu'elle affiche "chiffre:" puis la valeur. La fonction aff appellera simplement dynaff. Le constructeur devra stocker uniquement des nombres de 0 à 9.

1d  La classe hexa

Déclarer une sous-classe hexa ne comportant pas d'autre donnée membre spécifique, mais le constructeur à un argument entier, la fonction dynaff et la fonction aff.

Définir la fonction dynaff pour qu'elle affiche "hexa:" puis la valeur. La fonction aff appellera simplement dynaff. Le constructeur devra stocker uniquement des nombres de 0 à 15.

1e  Le programme principal

Déclarer deux objets de chaque sous-classe, initialisés l'un avec 0 l'autre avec 2.

Déclarer un tableau de 6 pointeurs de nombre, initialisé avec les adresses des 6 objets précédemment déclarés.

Appeler aff sur chaque objet, puis appeler aff sur chaque élément du tableau, et enfin appeler dynaff sur chaque élément du tableau.

Prévoir les affichages et les comparer avec ceux produits à l'exécution. Bien comprendre les mécanismes mis en jeu dans ces trois cas.

2  Le distributeur

2a  Fonction virtuelle pure

Dans STOCK.H, déclarer la fonction est_limite en virtuelle pure, et ajouter sa déclaration dans StocProd.H et StocPiec.H . Déplacer sa définition dans StocProd.CPP et la définir différemment dans StocPiec.CPP (par exemple, introduire un seuil inversement proportionnel à la valeur de la pièce).

Quelles conséquences pour la classe Stock ?

2b  Exceptions

Introduire dans ce programme la gestion des exceptions, qui ne doit pas traiter les erreurs potentielles de l'utilisateur du distributeur, mais d'éventuelles erreurs du programmeur ou du système.

Les exceptions semblent utiles dans au moins deux domaines : d'une part, dans la gestion des tableaux dynamiques (à la création et à chaque accès) ; d'autre part, dans la gestion de stock (indice supérieur au nombre réel de sortes de produits, rail plein, place restante insuffisante). Toutes les exceptions ne doivent pas obligatoirement être traitées au même niveau : une fonction peut transmettre une exception à sa fonction appelante.

Dans chacun de ces deux domaines, regrouper les différentes exceptions dans une hiérarchie de classes, mémoriser les informations nécessaires afin de fournir des messages d'erreur détaillés, modifier le prototype des fonctions concernées pour préciser les exceptions qu'elles lancent 1, redéfinir les fonctions unexpected() 2 et terminate() pour qu'elles affichent un message avant d'appeler abort() (voir l'aide en ligne sur toutes ces fonctions).

Tester le maximum de cas en ajoutant des erreurs volontaires. Deux solutions sont envisageables :

  1. modifier des instructions pour provoquer des erreurs, puis les enlever ensuite ;
  2. définir une constante EXCEPTION=3 (si vous voulez déclencher votre 3ème exception) dans l'option de compilation DEFINES, et écrire :
                 #if EXCEPTION == 3
                  if (une_condition) throw( une_exception_definie );
                 #endif
                
    
    Il suffira alors de définir la constante EXCEPTION=0 pour que le programme retrouve son comportement normal.
    Ne pas oublier de recompiler les fichiers contenant ces #if .

Footnotes:

1 mettre en commentaire pour MS-Visual C++ 6.0

2 inutile en MS-Visual C++ 6.0


File translated from TEX by TTH, version 2.75.
On 15 Dec 2000, 21:55.