Table of Contents

Partie III – Surcharge & Masquage

TD2

Nous repartons du code de MyBiDiCounter tel défini à la fin de la question 1 de la partie II.

Question n°1

Ajouter à la classe MyBiDiCounter une nouvelle méthode :

increment(unsigned value)
    si counter + value <= max
        counter <- counter + value
    sinon
        counter = (counter + value) mod max

Correction

Correction

class MyBiDiCounter: public MyCounter
{
public:
    MyBiDiCounter(): MyCounter() {}
    explicit MyBiDiCounter(unsigned theMax):
        MyCounter(theMax)
    {}
    MyBiDiCounter(unsigned theCounter,
        unsigned theMax): MyCounter(theCounter, theMax)
    {}
    MyBiDiCounter(const MyBiDiCounter& anotherCounter):
        MyCounter(anotherCounter.counter)
    {}
 
    void decrement()
    {
        if(counter == 0)
            counter = max;
        else
            counter --;
    }
 
    void increment(unsigned value)
    {
        if(counter + value < max)
            counter += value;
        else
            counter = (counter + value) % max;
    }
    void print() const
    {
        std::cout << "Compteur: " << counter << "/" << max << std::endl;
    }
};

Question n°2

Tester le bon fonctionnement de cette classe à partir du code suivant :

void testNewIncMethod() {
    MyBiDiCounter bidiCounter1(0, 5);
    for(unsigned i = 0; i <= 5; i++) 
    {
	bidiCounter1.increment(5);
        bidiCounter1.print();
    }
}

Question n°3

Tester le code suivant.

void testOldIncMethod() {
    MyBiDiCounter bidiCounter1(0, 5);
    for(unsigned i = 0; i <= 5; i++) 
    {
        bidiCounter1.increment();
        bidiCounter1.print();
    }
}

Expliquer pourquoi cela ne fonctionne pas ? Proposer une modification de l’appel pour que cela puisse fonctionner.

Correction

Correction

La nouvelle méthode increment(unsigned) cache l'ensemble des méthodes increment définies dans la classe de base MyCounter. Il faut dans ce cas ajouter à la classe :

public:
    using MyCounter::increment;

Ce qui nous donne la classe suivante :

class MyBiDiCounter: public MyCounter
{
public:
    MyBiDiCounter(): MyCounter() {}
    explicit MyBiDiCounter(unsigned theMax):
        MyCounter(theMax)
    {}
    MyBiDiCounter(unsigned theCounter,
        unsigned theMax): MyCounter(theCounter, theMax)
    {}
    MyBiDiCounter(const MyBiDiCounter& anotherCounter):
        MyCounter(anotherCounter.counter)
    {}
 
    void decrement()
    {
        if(counter == 0)
            counter = max;
        else
            counter --;
    }
    using MyCounter::increment;
    void increment(unsigned value)
    {
        if(counter + value < max)
            counter += value;
        else
            counter = (counter + value) % max;
    }
    void print() const
    {
        std::cout << "Compteur: " << counter << "/" << max << std::endl;
    }
};

Question n°4

Modifier la classe MyBiDiCounter de manière à ce que les deux méthodes soient accessibles, à la fois la méthode increment() et la méthode increment(unsigned).

Tester ensuite que le code initial de la fonction testOldIncMethod().