Nettoyage efficace et complet d'objets dans un vector
Bonsoir ( même s'il est bien tard pour le dire ).
Tout d'abord voilà le code ( qui compile et qui marche ) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include <iostream>
#include <string>
#include <vector>
using namespace std;
// Listing dynamique d'objets
// CLASSES
class artiste{
string nom;
public:
artiste(string nomE): nom(nomE) {}
~artiste() { cout << "Artiste supprime" << endl;}
void afficheNom(){ cout << nom << endl; }
};
class peintre : public artiste{
public:
int nbPeintures;
peintre(string nomE , int nbPaintE): artiste(nomE) , nbPeintures(nbPaintE) {}
~peintre() { cout << "Peintre supprime" << endl;}
void afficheNb(){ cout << nbPeintures << endl; }
};
// FONCTIONS
void ajoutVectorArtiste(vector<artiste*>& listing){
string nomE;
cout << "Nom du nouvel artiste ?" << endl;
cin >> nomE;
artiste* pArtiste = new artiste(nomE);
listing.push_back(pArtiste);
}
void ajoutVectorPeintre(vector<artiste*>& listing){
string nomE;
int nbPaintE;
cout << "Nom du nouveau peintre ?" << endl;
cin >> nomE;
cout << "Nombre de peintures ?" << endl;
cin >> nbPaintE;
peintre* pPeintre = new peintre(nomE,nbPaintE);
listing.push_back(pPeintre);
}
void afficheVectorArtiste(vector<artiste*>&listing){
if(listing.empty()){
cout << "Liste Vide" << endl;
} else {
int i = 1;
vector<artiste*>::iterator it;
for(it = listing.begin() ; it < listing.end() ; it++){
cout << i << " -> ";
(**it).afficheNom();
i +=1;
}
}
}
void RAZVectorArtiste(vector<artiste*>& listing){
cout << "RAZ du listing" << endl;
vector<artiste*>::iterator it;
for(it = (listing).begin() ; it < (listing).end() ; it++){
delete (*it);
}
(listing).erase((listing).begin() , (listing).end());
}
int main(){
vector<artiste*> listing;
// Menu Utilisateur
bool quit = false;
int rep = 0;
while ( quit == false){
cout << " 1 : Ajout Peintre //// 2 : Ajout Artiste //// 3 : RAZ /// 4 : Affiche Listing /// 0 : Quit" << endl;
cin >> rep;
switch(rep){
case 1 : { ajoutVectorArtiste(listing); break ; }
case 2 : { ajoutVectorPeintre(listing); break ; }
case 3 : { RAZVectorArtiste(listing); break ; }
case 4 : { afficheVectorArtiste(listing); break ;}
case 0 : quit = true ; break;
default : cout << "Entree Invalide" << endl; break;
}
}
return 0;
} |
J'ai plusieurs questions :
Est ce que ma fonction RAZ est vraiment efficace ? Appeler un erase pour le vector et un delete pour les objets est il "propre" ?
Si on crée un Peintre que l'on utilise RAZ j'ai remarqué que seul le destructeur de Artiste est appelé et non celui de Peintre. Ça ne me parait pas normal ...
Et petite question bonus : le default du switch concerne uniquement les caractères du type de la réponse ( si "rep" est int alors problème si le "rep" est char ).
Exemple ( je sais que je ne suis pas clair ^^' ) : si on fait un switch demandant une réponse en int alors le default concernera tout les int et non les char ?
Pour éviter le problème de la boucle infinie si on entre un char et non un int il faut obligatoirement ajouter une structure de contrôle lors de la saisie de la réponse ? Ou y'a t'il un moyen plus simple et moins long ?
Merci d'avance pour vos réponses, n'hésitez pas à dire que le code n'est pas propres ou qu'il est formulé d'une façon lourde et peu conventionelle
Bonne Nuit !