User Tools

Site Tools


in204:tds:sujets:td2:part2

This is an old revision of the document!


Partie II – Constructeurs & Arbres de Dérivation

TD2

Nous reprenons le code C++ de la partie précédente.

Question n°1

Ajoutez à la classe MyBiDiCounter l’ensemble des constructeurs dont notamment :

  • le constructeur par défaut,
  • le constructeur de recopie,
  • le constructeur spécifiant la valeur maximale,
  • le constructeur spécifiant à la fois la valeur courante du compteur et la valeur maximale.

Modifier le code de la fonction testMyBiDiCounter pour appeler le bon constructeur.

Sauvegarder votre projet pour pouvoir le réalisation dans la partie III du TD.

Dans la suite, nous vous conseillons de définir un nouveau projet utilisant une nouvelle copie des fichiers que vous avez réalisé, puisque nous allons partir de ce code à la fois dans les questions suivants mais aussi dans la partie III du TD.

Correction

Correction

Le code consolidé de la classe MyBiDiCounter est le suivant:

class MyBiDiCounter: public MyCounter
{
public:
    MyBiDiCounter(): MyCounter() {}
    MyBiDiCounter(const MyBiDiCounter& anotherCounter):
        MyCounter(anotherCounter) {}
    explicit MyBiDiCounter(uint theMaxValue): MyCounter(theMaxValue) {}
    MyBiDiCounter(uint theCounterValue, uint theMaxValue): 
        MyCounter(theCounterValue, theMaxValue) {}
 
    void decrement() 
    {
        if(counter > 0) 
            counter --;
        else
            counter = max;
    }
 
    void print() const
    {
        std::cout << "Compteur: " << counter << "/" << max << std::endl;
    }
};

Ceci permet de simplifier le code de la fonction testMyBiDiCounter en supprimant les appels aux fonctions setMax et reset.

void testMyBiDiCounter()
{
    MyBiDiCounter counterA(4);
    counterA.print();
    for(int i=0; i < 6; i++)
    {
        counterA.increment();
        counterA.print();
    }
    for(int i=0; i < 6; i++)
    {
        counterA.decrement();
        counterA.print();
    }
}

Question n°2

La classe MyBiDiCounter ajoute la fonction decrement à la classe MyCounter.

En fait, nous pouvons définir une famille de compteur :

  • Le compteur ForwardCounter qui compte de 0 à max et repars à 0.
  • Le compteur BackwardCounter qui compte max à 9 et repars à max.
  • Et le compteur BiDiCounter qui peut incrémenter ou décrémenter le compteur interne.

Nous souhaitons partager le maximum de code entre ces différents compteurs. Une solution consiste à définir l’arbre de dérivation suivant :

et nous souhaitons factoriser le maximum de code entre les classes ForwardCounter, ReverseCounter & BiDiCounter, l’objectif étant que ces trois classes contiennent le minimum de code.

Question n°2.1

Faites la liste des méthodes, champs pouvant être partagés et la liste des méthodes et champs propres à chacune des classes.

Question n°2.2

Implanter la classe BaseCounter. On s’inspirera fortement de la classe MyCounter déjà définie.

Question n°2.3

Implanter les classes ForwardCounter, BackwardCounter et BiDiCounter qui héritent chacune de la classe BaseCounter.

Question n°3

Tester le comportement de vos compteurs à partir du code suivant

void testFamilyOfCounters()
{
    ForwardCounter incCounter(0, 4);
    BackwardCounter decCounter(0, 3);
    BiDiCounter biDiCounter(0, 5);
    for(int i=0; i < 6; i++)
    {
        incCounter.increment();
        incCounter.print();
	decCounter.decrement();
        decCounter.print();
        biDiCounter.increment();
        biDiCounter.print();
    }
    for(int i=0; i < 6; i++)
    {
        biDiCounter.decrement();
        biDiCounter.print();
    }
}
in204/tds/sujets/td2/part2.1569258272.txt.gz · Last modified: 2019/09/23 17:04 by bmonsuez