Correction TP1 Exercice 4
Enoncé On veut écrire un programme qui permet de gérer une liste de notes grâce à un tableau de taille variable On créé la classe note : Note nom : string prenom : string valeur : int Note(string,string,int) ~Note() void affiche()
Et les pointeurs? L’avantage des pointeurs, c’est de pouvoir créer et détruire à volonté des notes : Note *ptr; ptr=new Note("thib", "Lelore",12); ptr->affiche(); delete ptr; ptr=new Note("Gaston", "Fourien",18);
Source d’erreurs Où est l’erreur : Note *ptr; ptr=new Note("thib", "Lelore",12); ptr=new Note("Gaston", "Fourien",18); ptr->affiche(); delete ptr;
Source d’erreurs Où est l’erreur : Note *ptr; ptr=new Note("thib", "Lelore",12); delete ptr; ptr=new Note("Gaston", "Fourien",18); ptr->affiche();
Une liste de note Le principe est d’utiliser un tableau de pointeurs : Note *tableau[6]; Tableau[0]=new Note("Lelore", "Thib",10); Tableau[1]=new Note("Fourien", "Gaston",18); Tableau[2]=new Note("Zarhi", "Fred",17); Tableau[3]=new Note("Chirac", "Jaco",4.5); Tableau[4]=new Note("Sarko", "Nico",8); Tableau[5]=new Note("Royal", "Sego",12); Lelore Thib 10 Fourien Gaston 18 Zarhi Fred 17 Chirac Jaco 4.5 Sarko Nico 8 Royal Sego 12
Nouvelle et ancienne représentation 23BA 23B7 23B3 23AF 23AB Lelore Thib 10 23A8 Fourien Gaston 18 23A7 23BA 23A6 Zarhi Fred 17 23B7 23A5 23B3 23A4 Chirac Jaco 4.5 23AF 23A3 23AB Sarko Nico 8 23A2 23A8 Royal Sego 12
Finalement Quels sont les avantages par rapport à un tableau de Note simple? Quand on écrit Note tableau[10]; On créé 10 notes vides (en utilisant le constructeur par défaut) Quand on écrit Note *tableau[10]; On créé 10 cases qui ne pointent sur rien On peut créer des Notes au besoin. Plus logique (on créé des notes quand il faut) Plus simple pas besoin de penser à créer un constructeur par défaut
Donc la fonction ajoutNote Ce qu’il faut c’est ajouter une note dans la bonne case void ajoutNote(string nom,string prenom, int note){ this->tableau[this->nb]=new Note(nom,prenom,note); this->nb=this->nb+1; } Donc on utilise une variable pour savoir dans quelle case ajouter la note (this->nb) Par contre, on a oublié de tester si on ne sort pas du tableau (si on a 10 cases et qu’on veux créer une 11ème note…)
this->tableau[i]->affiche(); Afficher les notes Pour afficher toutes les notes, il faut utiliser une boucle. Deux manières de faire : void afficherNotes(){ for(int i=0;i<this->nb;i++){ *(this->tableau[i]).affiche(); } this->tableau[i]->affiche();
Conclusion this est un pointeur ! C’est un pointeur sur nous même -> permet d’utiliser les méthodes et attributs d’un pointeur Si c’est this->, c’est les méthodes et attributs de notre classe Si c’est ptr->, c’est les méthodes et attributs de la classe de l’objet pointé…
Mais c’est pas tout… Il faut permettre de faire un tableau de différentes tailles Il faut donc faire un pointeur sur un tableau de pointeurs Deux manières : Note **tableau; Note *tableau[]; Choisissez celle que vous préférez… Ensuite, créer le tableau comme ça : tableau=new Note*[10];
Ça se complique… Bon, et le destructeur ? On a tous pensé faire delete [] this->tableau; C’est pas suffisant : Lelore Thib 10 Fourien Gaston 18 23A8 Zarhi Fred 17 23AB 23AF 23A1 Chirac Jaco 4.5 23B3 23B7 Sarko Nico 8 23BA Royal Sego 12
Ça se complique… Résultat : Lelore Thib 10 Fourien Gaston 18 Zarhi Fred 17 23AB 23AF 23A1 Chirac Jaco 4.5 23B3 23B7 Sarko Nico 8 23BA Royal Sego 12
Pour bien faire : Parcourir le tableau pour détruire chaque case Puis détruire le tableau : for (int i=0;i<this->nb;i++){ delete this->tableau[i]; } delete [] tableau; Et là, c’est bon…
Résultat : Lelore Thib 10 Fourien Gaston 18 Zarhi Fred 17 Chirac Jaco 23AB 23AF 23A1 Chirac Jaco 4.5 23B3 23B7 Sarko Nico 8 23BA Royal Sego 12