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