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()
.