Chapitre 8. Patrons de fonctions Templates

Documents pareils
Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Introduction à l héritage en C++

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

et Programmation Objet

Programmation C++ (débutant)/instructions for, while et do...while

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Quelques éléments de compilation en C et makefiles

Plan Pédagogique du cours

Introduction au langage C

Avertissement : Ce cours suppose la connaissance et la maîtrise du langage C CONTENU DU COURS BIBLIOGRAPHIE

Programme Compte bancaire (code)

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Claude Delannoy. 3 e édition C++

Introduction à C++ et à wxwidgets

Le langage C. Séance n 4

Le langage C++ (partie I)

INFO-F-105 Language de programmation I Séance VI


RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Java Licence Professionnelle CISII,

ETUDE DE CAS en UML : GESTION DES COMMANDES DE PIECES FABRIQUEES PAR LA SOCIETE C

Premiers Pas en Programmation Objet : les Classes et les Objets

Cours 1: Java et les objets

Introduction au pricing d option en finance

Le prototype de la fonction main()

I. Introduction aux fonctions : les fonctions standards

1.6- Génération de nombres aléatoires

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmation impérative

Corrigé des exercices sur les références

Cours d initiation à la programmation en C++ Johann Cuenin

Informatique I. Sciences et Technologies du Vivant (Semestre 1)

Cours d Algorithmique et de Langage C v 3.0

Une introduction à Java

Introduction à l algorithmique et à la programmation M1102 CM n 3

Programmation stochastique

Programmation système I Les entrées/sorties

Les structures. Chapitre 3

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Cours de C/C++ par la pratique. Hugues Talbot

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Cours Langage C/C++ Programmation modulaire

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

LE LANGAGE C++ ENAC 1997 A. DANCEL

Algorithmique et Programmation, IMA

PROJET 1 : BASE DE DONNÉES REPARTIES

Programmation en C/C++

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Conventions d écriture et outils de mise au point

TD3: tableaux avancées, première classe et chaînes

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Utilisation d objets : String et ArrayList

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Tp 1 correction. Structures de données (IF2)

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Chapitre 2. Classes et objets

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

IUT ANNECY Département Mesures Physiques Cours d informatique Initiation au langage C

Programmation par les Objets en Java

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

TP : Gestion d une image au format PGM

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Systeme d'exploitation

Cours Programmation Système

INITIATION A LA PROGRAMMATION

Programmation en Java IUT GEII (MC-II1) 1

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

ACTIVITÉ DE PROGRAMMATION

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Cours de Systèmes d Exploitation

Les chaînes de caractères

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

TD/TP PAC - Programmation n 3

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Chapitre 1 : La gestion dynamique de la mémoire

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

PROJET ALGORITHMIQUE ET PROGRAMMATION II

CHAPITRE V. Recherche et tri

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Corrigés des premiers exercices sur les classes

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Programmation système en C/C++

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Généralités sur le Langage Java et éléments syntaxiques.

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Introduction à la Programmation Parallèle: MPI

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Transcription:

Chapitre 8 : Patrons de fonctions 183 Chapitre 8 Patrons de fonctions Templates Chapitre 8 : Patrons de fonctions 184 1. Généralités - Modèle que le compilateur utilise pour créer des fonctions au besoin. - Nous désirons écrire une fonction qui va permettre d'interchanger deux valeurs : // Interchanger deux entiers void echange(int& a, int& b){ int temp = a; a = b; b = temp; // Interchanger deux réels void echange(double& a, double& b){ double temp = a; a = b; b = temp; // Interchanger deux caractères void echange(char& a, char& b){ char temp = a; a = b; b = temp;

Chapitre 8 : Patrons de fonctions 185 - On constate que nous sommes en présence du même code, seul le type traité qui diffère. - Solution: définir un patron pour cette fonction. void echange(t& a, T& b){ T temp = a; a = b; b = temp; - «T» est un paramètre qui prend la place d'un type, n'importe quel type (int, double, char etc.). - Cette fonction est vue comme la surdéfinition de fonctions, sauf que nous sommes en présence d'une seule définition qui va être valable pour tous les types: {«int», «double», «char» etc. - C'est le compilateur qui se charge d'instancier le patron de fonction et au besoin ce qui entraîne moins de risques d'erreurs et permet d éviter tous les types de pléonasme. Chapitre 8 : Patrons de fonctions 186 2. Instanciation Type «int» int x=10, y=20; Les variables x et y sont de type «int». Le compilateur instancie «T» à «int» et génère la fonction «void echange(int&,int&)». La fonction appelée est «echange(x,y)». Type «double» double x=10.5, y=20.8; Les variables x et y sont de type «double». Le compilateur instancie «T» à «double» et génère la fonction «void echange(double&,double&)». La fonction appelée est «echange(x,y)».

Chapitre 8 : Patrons de fonctions 187 Type «char» char x='a', y='b'; Les variables x et y sont de type «char». Le compilateur instancie «T» à «char» et génère la fonction «void echange(char&,char&)». La fonction appelée est «echange(x,y)». Type «Compte» Compte x(120.5), y(250.8); Les variables x et y sont de type «Compte». Le compilateur instancie «T» à «Compte» et génère la fonction «void echange(compte&,compte&)». La fonction appelée est «echange(x,y)». Chapitre 8 : Patrons de fonctions 188 - Puisque la fonction «echange» contient les deux lignes suivantes: T temp = a; // Appel du constructeur de recopie. a = b; // Appel de l opérateur d affectation. - Faire attention aux cas où la classe contient un membre de la partie donnée alloué dynamiquement. - Si c'est le cas, il faudra définir le constructeur de recopie ainsi que l'opérateur d'affectation.

Chapitre 8 : Patrons de fonctions 189 3. Exemple d affichage d un tableau générique template <class Z> void affiche (Z tab[],int taille) { for (int i=0;i<taille;i++) cout << tab[i] << endl; // Crée une version du tableau pour chaque type, // et affiche ses valeurs en sortie int main() { double tab1[3] = {1.5,2.4,5.8; affiche(tab1,3); char tab2[4] = {'a','b','c','d'; affiche(tab2,2); compte C1(345.68); compte C2(999.99); compte tab3[2]= {C1,C2; affiche(tab3,2); return 0; Chapitre 8 : Patrons de fonctions 190 4. Répartition des déclarations de patrons de fonctions entre des fichiers «.h» et «.cpp» - Les modèles de fonctions doivent être déclarés dans le fichier «*.h» // Fichier affiche.h #include <iostream> // ifndef/define/endif sont là pour empêcher // de multiples inclusions du fichier d'en-tête. #ifndef T_AFF #define T_AFF template <class Z> void affiche (Z tab[],int taille) { for (int i=0;i<taille;i++) cout << tab[i] << endl; #endif

Chapitre 8 : Patrons de fonctions 191 // fichier compte.h #include <iostream> #ifndef H_COMP #define H_COMP class compte { double solde; public: compte(double m):solde(m) { friend ostream& operator<<(ostream&,const compte&); ; ostream& operator<<(ostream& out,const compte& a) { cout << "solde: " << a.solde ; return out; #endif // Fin fichier compte.h Chapitre 8 : Patrons de fonctions 192 // Fichier prgtest.cpp // Le fichier qui contient la fonction main #include "affiche.h" #include "compte.h" using namespace std; int main() { double tab1[3] = {1.5,2.4,5.8; affiche(tab1,3); char tab2[4] = {'a','b','c','d'; affiche(tab2,2); const char* tab3[4] = {"Fred","Joe","Paul","Marie"; // On affiche réellement la chaîne, pas besoin // de spécifier le * affiche(tab3,4); compte C1(345.68); compte C2(999.99); compte tab4[2]= {C1,C2; affiche(tab4,2); return 0; // Fin fichier prgtest.cpp

Chapitre 8 : Patrons de fonctions 193 Commande de compilation g++ -Wall -o prgexe prgtest.cpp sinon g++ -pedantic -o prgexe prgtest.cpp Affichage en sortie 1.5 2.4 5.8 a b Fred Joe Paul Marie solde: 345.68 solde: 999.99 Chapitre 8 : Patrons de fonctions 194 5. Compilateur et patron de fonctions - Le compilateur cherche dans : Les fonctions ordinaires en cherchant une signature identique (un match exact) des types d'arguments. Les patrons de fonctions avec une signature identique. Les fonctions ordinaires en essayant promotions et conversions. Sinon erreur de compilation. 6. Possibilités de paramètres de type 6.1. Généralités Les paramètres de type peuvent être utilisés à tout endroit raisonnable dans la fonction, par exemple: double bidon(int n, T a, double z) { T x; T* ptr; ptr = new T; etc.

Chapitre 8 : Patrons de fonctions 195 6.2. Utilisation dans un cas simple void echange(t&,t&); - Pas forcément une fonction à deux arguments. On peut avoir aussi une fonction à un seul argument. 6.3. Utilisation avec un type fixe void affiche(t[],int); 6.4. Utilisation avec plus d un paramètre générique void copier(t[],int); ou encore : template<class T, class U> void copier(t dest[], U source[],int n); Chapitre 8 : Patrons de fonctions 196 6.5. Exemple d une recopie de tableau // Fichier copier.h #include <iostream> #ifndef T_COPIER #define T_COPIER template<class T, class U> void copier(t dest[], U source[],int n) { #endif for (int i=0;i<n;i++) dest[i] = (T) source[i];

Chapitre 8 : Patrons de fonctions 197 // Fichier copier.cpp #include "copier.h" #include "affiche.h" int main() { double dtab[3] = {1.1,2.2,3.3; int itab[3] = {4,5,6; // On fait l'hypothèse que «itab» et «dtab» ont // la même taille, sinon il faudra réécrire autrement // la fonction «template» «copier». copier (itab,dtab,3); affiche(itab,3); copier (dtab,itab,3); affiche(dtab,3); return 0; Chapitre 8 : Patrons de fonctions 198 7. Surdéfinition de patrons de fonctions - Si pour un type particulier le code est différent par rapport aux autres types => il faudra surdéfinir le patron. // fichier min.h #include <iostream> #ifndef H_MIN #define H_MIN T& min (T& a,t& b) { if (a < b) return a; return b; #endif // fichier min.cpp #include "min.h" int main() { int x=99, y=20; cout << min(x,y) << endl; // 20 char c1='a',c2='b'; cout << min(c1,c2) << endl; // a return 0;

Chapitre 8 : Patrons de fonctions 199 - Et si l on traitait le cas : const char *ch1 = "ok"; const char *ch2 = "bon"; - La fonction «template» «min» compare dans ce cas les adresses et non pas le contenu des adresses : A234 A230 \0 k o A234 ch1 &ch1 A100 \0 n o b A070 A100 ch2 &ch2 Chapitre 8 : Patrons de fonctions 200 - Dans cet exemple, nous comparons «A100» à «A234». Nous aurons en sortie «bon», car la chaîne est stockée dans la zone basse de la mémoire. - Pour éviter que le résultat soit dépendant de la position de la chaîne dans la zone mémoire et non pas du contenu des adresses, nous devons définir une fonction particulière pour traiter le cas «char*» : const char* min (const char* a, const char* b) { if (strcmp(a,b) <0) return a; return b;