This is an old revision of the document!
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
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.
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().