nisaloncaje
Messages postés154Date d'inscriptionsamedi 7 janvier 2006StatutMembreDernière intervention28 septembre 2008
-
14 janv. 2007 à 16:25
nisaloncaje
Messages postés154Date d'inscriptionsamedi 7 janvier 2006StatutMembreDernière intervention28 septembre 2008
-
6 févr. 2007 à 19:08
Bonjour, j'aimerais créer un tableau de type vector, mais que ce tableau puisse contenir plusieurs type d'objets mais qui héritent tous d'une meme classe : si j'ai par exemple trois classes a1,a2,a3 qui héritent de la classe A, j'aimerais que le tableau puisse contenir indifféremment des objets de type a1,a2,a3
nisaloncaje
Messages postés154Date d'inscriptionsamedi 7 janvier 2006StatutMembreDernière intervention28 septembre 2008 20 janv. 2007 à 20:19
Merci beaucoup !!! Et pour les supprimer du tableau, il faut que je détruise l'objet deux fois non ? une fois dans le tableau et une fois hors du tableau ? et si oui, comment faire pour faire le lien entre l'objet hors du tableau et dans le tableau ?
class b : public a
{
int aff()
{
printf("objet B\n");
}
};
class c : public a
{
int aff()
{
printf("objet C\n");
}
};
int main()
{
std::vectorTab;
for(int i=0;i<8;i++)
{ // premiere méthode pour allouer, on crée comme avant .. mais en boucle !!
a * filsC = new c;
Tab.push_back(filsC);
}
for(int i=0;i<8;i++)
{
Tab.push_back(NULL);
Tab[Tab.size()-1] = new b; // on crée directement sur le tableau
// on aurait même simplifier en Tab.push_back(new b); class nan ?? ^^
}
for(int i=0;i<Tab.size();i+=3)
{
Tab[i]->~a();// voila comment on efface ...
Tab[i] = NULL; // pour ensuite savoir lequels pointe bien sur qqchose ( l'erreur est très joli //sinon ) .. :D
}
for(int i=0;i<Tab.size();i++)
if(Tab[i]!=NULL) // faut éviter d'appeller des objets "vides" ..
Tab[i]->aff();
else
printf("Aucun objet\n");
printf("\n"); // au cause de la bufferisation du stdout ...
return 0;// toujours mettre un return 0 ...
}
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 21 janv. 2007 à 22:27
En fait pour le Tab[i]->~a(); je pense qu'il vaut mieux mettre delete Tab[i] ..
La virtual sert à utiliser des objets mixtes, ici on l'utilise sous forme a .. sinon il faudrait caster en b ou c ...
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 22 janv. 2007 à 22:11
J'ai l'impression qu'un bon tuto sur l'héritage te serait plus utile que mes réponses vite faites.
caster c'est à dire mettre comme si c'était un b ou un c
A quoi te sert d'avoir un vecteur de plein de types hérités si tu ne sais ni caster ni utiliser des fonctions virtuelles ?
nisaloncaje
Messages postés154Date d'inscriptionsamedi 7 janvier 2006StatutMembreDernière intervention28 septembre 2008 4 févr. 2007 à 17:15
resalut :)
c'est bon j'ai trouvé un bon bouquin qui m'a tout bien expliqué les fonctions virtuelles ...
J'ai fait ce que vous m'aviez conseillé mais le compilateur (dev c++) me donne l'erreur suivante, que je n'arrive pas a comprendre :
main.o(.text$_ZN5objetC2Effffff[objet::objet(float, float, float, float, float, float)]+0x3d) In function `ZNSt12_Vector_baseIP5objetSaIS1_EE12_Vector_implD1Ev':
[Linker error] undefined reference to `vtable for objet'