/* IFT1166 - démonstration #4 - exercice 3 02-octobre-2005 v1.00 M.Lokbani énoncé à partir de Johnston. contact: lokbani@iro.umontreal.ca Cet exercice a pour but de vous familiariser avec la surdéfiniton de fonctions. Les ambiguïtés possibles et comment les résoudre. Copyright (C) 2005 Université de Montréal Département d'informatique et de Recherche Opérationnelle M. Lokbani -- Tous Droits Réservés -- All Rights Reserved -- */ #include #ifdef EXO_ORIG int GetIt(int); float GetIt(int); double GetIt(int); #else int GetIt(int=9); float GetIt(float); double GetIt(double); #endif using namespace std; int main() { #ifdef EXO_ORIG int n = GetIt(); float n = GetIt(); double n = GetIt(); #else int ni = GetIt(); float nf = GetIt(2.7f); double nd = GetIt(3.5); cout << "ni: " << ni << " ; nf= " << nf << " ; nd= " << nd << endl; #endif return 0; } #ifndef EXO_ORIG int GetIt(int x) {cout << "GetItint" << endl; return x;} float GetIt(float x) {cout << "GetItfloat" << endl; return x;} double GetIt(double x) {cout << "GetItdouble" << endl; return x;} #endif /* La compilation de ce programme génère une série d'erreurs ... >g++ -Wall -pedantic -Os -DEXO_ORIG -c demo4exo3sol.cpp -o demo4ex3sol.o demo4exo3sol.cpp:25: new declaration `float GetIt(int)' demo4exo3sol.cpp:24: ambiguates old declaration `int GetIt(int)' demo4exo3sol.cpp:26: new declaration `double GetIt(int)' demo4exo3sol.cpp:25: ambiguates old declaration `float GetIt(int)' demo4exo3sol.cpp: In function `int main()': demo4exo3sol.cpp:26: too few arguments to function `double GetIt(int)' demo4exo3sol.cpp:38: at this point in file demo4exo3sol.cpp:38: warning: initialization to `int' from `double' demo4exo3sol.cpp:38: warning: argument to `int' from `double' demo4exo3sol.cpp:39: conflicting types for `float n' demo4exo3sol.cpp:38: previous declaration as `int n' demo4exo3sol.cpp:26: too few arguments to function `double GetIt(int)' demo4exo3sol.cpp:39: at this point in file demo4exo3sol.cpp:40: conflicting types for `double n' demo4exo3sol.cpp:39: previous declaration as `float n' demo4exo3sol.cpp:26: too few arguments to function `double GetIt(int)' demo4exo3sol.cpp:40: at this point in file demo4exo3sol.cpp:40: warning: unused variable `double n' >Exit code: 1 Remarques: --------- -1- Surdéfinir une méthode signifie lui donner le même nom mais les arguments doivent être différents. Or dans cet exercice, la méthode porte le même nom (ok), le même nombre d'arguments (ok) mais de même nature (problème). int GetIt(int); float GetIt(int); double GetIt(int); Le type de retour n'entre pas en considération lors de la surdéfinition de fonctions. Une solution possible consiste à faire ces 3 déclarations: int GetIt(int); float GetIt(float); double GetIt(double); -2- On ne peut pas "surdéfinir" une variable! Plus exactement déclarer la même variable n fois dans un programme même si le type est différent. int ni = GetIt(); float nf = GetIt(); double nd = GetIt(); -3- Déclarer une fonction ne veut pas dire qu'elle a été définie i.e. que le compilateur sache ce qu'elle va faire. Il faudra écrire la définition de la fonction. Que cette définition vienne d'une bibliothèque externe c'est ok. Mais ce n'est pas le cas de cet exemple. int GetIt(int x) {return x;} float GetIt(float x) {return x;} double GetIt(double x) {return x;} -4- Lors de l'appel à la fonction GetIt, on doit passer une valeur réelle, ou bien initialiser l'argument de la fonction avec une valeur par défaut. Par exemple: int GetIt(int=0); ou bien: int GetIt(int x=0) {return x;} */