===== Partie III – Surcharge & Masquage =====
[[in204:tds:sujets:td2|TD2]]
Nous repartons du code de ''MyBiDiCounter'' tel défini à la fin de la question 1 de la [[in204:tds:sujets:td2:part2|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()''.