/* IFT1166 - démonstration #9 - exercice 01 18-novembre -2005 v1.01 M.Lokbani - MàJ pour A05 27-juin -2000 v1.00 M.Lokbani - énoncé examen final Été 2000. contact: lokbani@iro.umontreal.ca Copyright (C) 2003-2005 Université de Montréal Département d'informatique et de Recherche Opérationnelle Mohamed Lokbani -- Tous Droits Réservés -- All Rights Reserved -- Description: ------------ Le programme contient 5 erreurs de syntaxe. Indiquez les et indiquez la correction qu'il faudra apporter. À signaler les numéro de lignes ne font pas partie du programme, elles sont la à titre indicatif. Des erreurs sur une même ligne compte pour une seule erreur. */ #include class Droite { Coordonnee gauche; // extrémité gauche Coordonnee droite; // extrémité droite public: Droite(int gx,int gy,int dy):gauche(gx,gy),droite(dx,dy){} Droite(const Droite& d)gauche(d.gauche),droite(d.droite) {} bool operator==(const Droite& d2){ if ((gauche==d2.gauche) && (droite==d2.droite)) return true; return false; } }; class Coordonnee { int x; int y; public: Coordonnee(int a, int b): x(a);y(b){} Coordonnee(const Coordonnee& c) { x = c->x; y = c->y; } bool operator==(const Coordonnee& c) { if ((x==c.x) && (y==c.y)) return true; return false; } }; int main() { Droite d1(2,3,4,5); Droite d2(7,8,9,10); Droite d3(d1); cout << (d1==d3) << (d2==d3) << (d1==d2) << endl; return 0; } /* Erreur 1: Ligne 29: Droite(int gx,int gy,int dy):gauche(gx,gy),droite(dx,dy){} Motif: Manque un argument. La classe Droite contient deux membres objets de type Coordonnee: gauche et droite. Chaque objet accède à ses deux membres (x et y). De ce fait le constructeur de Droite a besoin de 4 arguments, or à la ligne 6, on ne lui passe que 3, d'où erreur. Correction: Droite(int gx,int gy,int dx,int dy):gauche(gx,gy),droite(dx,dy){} Erreur 2: Ligne 30: Droite(const Droite& d)gauche(d.gauche),droite(d.droite) {} Motif: Manque les deux points. Ici nous avons affaire au constructeur de recopie. Si nous voulons initialiser les arguments sur la ligne de l'entête en utilisant une liste d'initialisation, il est nécessaire de séparer cette liste de l'appel par :. Correction: Droite(const Droite& d):gauche(d.gauche),droite(d.droite) {} Erreur 3: Ligne 41: Coordonnee(int a, int b): x(a);y(b){} Motif: problème avec l'utilisation du point virgule. Quand on est en présence d'une liste d'initialisation, il faut utiliser la virgule pour séparer les éléments de la liste et non pas le point virgule. Correction: Coordonnee(int a, int b): x(a),y(b){} Erreur 4: Ligne 43: x = c->x; y = c->y; Motif: utilisation de l'opérateur de sélection de membre via un pointeur -> L'objet c du type Cordonne est passé par référence, l'accès à ses membres se fait en utilisant le sélecteur de membre via un objet, i.e. . Correction: x = c.x; y = c.y; Erreur 5: Lignes : Tout le bloc compris entre les lignes 37 et 49 (comprises). Motif: La déclaration de la classe est faite après celle de la classe Droite, sachant que cette dernière contient des objets du type Coordonnee (ligne 26 et 27). Nous devons en conséquence faire connaître au programme l'existence de cette classe avant celle de Droite (l'entête de la classe Coordonnee par exemple). Cette solution n'est pas vraiment suffisante, car la ligne 27 par exemple fait appel au constructeur de Coordonnee qui est déclaré à la ligne 41. De ce fait la déclaration de la classe Coordonnee (et donc le prototype de ses fonctions membres) doit se faire avant celle de Droite. Solution: La plus rapide à faire, c'est de déplacer le bloc 37 à 49 avant la ligne 25. */