Dans l’ensemble de ce TP, vous allez tester le comportement de la redéfinition des opérateurs. Pour bien maîtriser ces concepts, il est impératif d’utiliser le « debugger » pour contrôler l’enchaînement des exécutions notamment lors de l’appel implicite des constructeurs. Pour cela, appuyer successivement sur la touche « F7 » (Mode pas à pas approfondi).

Par rapport à l’écriture de base de la déclaration de la classe « Complexe », vous allez rajouter successivement un ensemble de fonctionnalités. A chacune de ces fonctionnalités, un scénario vous sera proposer afin de contrôler la nouvelle fonction (ou méthode). Ce test sera systématiquement évalué avec le « debugger » en mode pas à pas approfondi.

Corrections : (cliquez sur le fichier source à visualiser)-- récupération des sources
Les opérateurs peuvent être redéfinis pour tous les types créés par le programmeur. C’est évidemment le cas pour les classes, mais également pour tous les autres types définis par l’utilisateur. Nous avons déjà étudiés les énumérations en constatant que, par défaut, les incrémentations et les décrémentations ne sont pas pris en compte. Cet exercice consiste à palier ce problème. Nous aimerions pouvoir implémenter le scénario proposé ci-dessous. Il est à noter que, dans le cadre d’une énumération, il n’est pas possible d’utiliser des méthodes (fonctions membres à l’énumération).
Par ailleurs, il existe deux types d’incrémentation : la pré-incrémentation, et la post-incrémentation. Dans le premier cas, la signature de l’opération est classique (à vous de trouver). Dans le second, il est nécessaire d’utiliser une signature différente pour que le compilateur sache faire la différence, et dans ce cas, il a été prévu de rajouter un paramètre supplémentaire de type entier. Généralement ce paramètre supplémentaire ne sert à rien, on peut donc l’ignorer. Il faut, par contre, qu’il apparaisse pour que le compilateur sache faire la différence entre la pré et la post incrémentation.
Nous allons reprendre la classe Diviseurs qui représente l'ensemble des diviseurs d'un nombre entier naturel. Nous allons rajouter de nouvelles compétences afin que notre classe devienne de plus en plus performante, et surtout encore plus agréable à utiliser. Pour cela, vous allez redéfinir deux opérateurs qui permettront d'exploiter cette classe de façon plus conviviale, savoir :
Pour tester votre nouvelle classe, vous utiliserez le même programme que nous avions déjà mis en oeuvre dans le TP précédent.
Avec ci-dessous, le programme principal qui bénéficie de l'apport de ces nouveaux opérateurs :
Corrections : Cliquez sur le fichier source à visualiser
Nous allons également changer le comportement de la classe Polynome qui, je le rappelle, représente, par exemple, le nombre suivant :

Nous allons, tout simplement rajouter quelques fonctionnement supplémentaires afin de permettre une meilleurs convivialité quant aux objets relatifs à cette classe. Pour cela, nous allons redéfinir un certain nombre d'opérateurs :

Tout d'abord, concernant la classe Rationnel, vous avez déjà défini une fonction addition qui permet d'effectuer l'addition de deux nombres rationnels. Il serait préférable d'utiliser l'opérateur + à la place de cette fonction addition.
Ensuite, comme cela vous est présenté dans le diagramme UML ci-dessus, vous allez redéfinir l'opérateur + ainsi que l'opérateur [ ]. Attention, ce dernier doit être privé. Il est seulement utilisé par les méthodes inernes. Dans ce cas précis, il est préférable d'imposer à l'utilisateur de la classe, les méthodes spécifiques setCoef et getCoef plutôt que l'opérateur [ ] par soucis de visibilité.
En tenant compte du diagramme de classe ci-dessus et du scénario proposé ci-dessous, construisez les classes Polynome et Rationnel.
#include "Polynome.h"
//------------------------------------------------------------------------------
int main()
{
Polynome p(3);
p.setCoef(0, 5);
p.setCoef(1, Rationnel(3, 2));
p.setCoef(2, Rationnel(7,4, Negatif));
p.setCoef(3, 10);
Polynome p1 = Rationnel(8, 5, Negatif);
Rationnel r[] = { 8, Rationnel(5, 2, Negatif), 7, Rationnel(7, 1, Negatif)};
Polynome p2(3, r);
p.getCoef(1).setDenominateur(4);
Polynome p3(3);
p3 = p + p2;
return 0;
}
//------------------------------------------------------------------------------
Utiliser le debugger pour bien tester le fonctionnement global. Vous en profiterez pour bien contrôler le cheminement des appels des méthodes respectives. Vous remarquerez que l'addition ne fonctionne pas très bien. Il est nécessaire de redéfinir complètement le comportement par défaut de la classe Polynôme puisqu'elle dispose d'objets internes dynamiques. Ce sujet sera traité dans la prochaine leçon.
Corrections : Cliquez sur le fichier source à visualiser