Vector de plusieurs types

Résolu
nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 septembre 2008 - 14 janv. 2007 à 16:25
nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 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

Merci d'avance

nC

14 réponses

nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 septembre 2008
6 févr. 2007 à 19:08
non c'est bon j'ai trouvé, j'avais oublié de mettre le = 0 après virtual ...

Merci :)
3
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
14 janv. 2007 à 18:28
Voila un exemple valant mille fois des ( mes ) explications :

#include <stdio.h>
#include <stdlib.h>
#include <vector>

class a
{
public:
  int membre;
  virtual int aff() = 0;
};

class b : public a
{
  int aff()
  {
    printf("%d\n",membre*2);
  }
};

class c : public a
{
  int aff()
  {
    printf("%d\n",membre*2+1);
  }
};

int main()
{
  std::vectorTab;
  a  * filsB = new b;
  filsB->membre = 1;
  a  * filsC = new c;
  filsC->membre = 1;
  Tab.push_back(filsB);
  Tab.push_back(filsC);
  for(int i=0;i<Tab.size();i++)
    Tab[i]->aff();
  printf("\n");
 return 0;
}

( la seule subtilité étant le fait d'utiliser des pointeurs pour instancier les objets   ... )
Louis
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
14 janv. 2007 à 18:29
Oups un ptit int s'est glissé dans ma déclaration .. on peut le remplacer par un void  j'espere que tu m'en voudras pas  ^_^

Louis
0
nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 septembre 2008
19 janv. 2007 à 20:08
d'accord. Donc si je comprends bien : on fait un vector contenant en fait les adresses des variables, n'est ce pas ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
20 janv. 2007 à 08:09
En fait il faut que tes objets soit déclaré du type de la classe mère qui ici est abstraite donc forcement des variables .. oui ..

Louis
0
nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 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 ?
0
nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 septembre 2008
20 janv. 2007 à 20:42
Et comment faire pour, par exemple créer toute une série de n objets de type b, et les mettre dans le tableau avec un for?

Car ici, on déclare les objets 1 par 1 puis on les met dans le tableau ...
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
20 janv. 2007 à 23:28
Voila je t'ai concocté un exemple légerement commenté :

#include <stdio.h>
#include <stdlib.h>
#include <vector>

class a
{
public:
  virtual int aff() = 0;
};

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 ...
}


                
0
nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 septembre 2008
21 janv. 2007 à 12:42
merci

mais pq avoir une virtual ?
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
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 ...

Louis
0
nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 septembre 2008
22 janv. 2007 à 19:06
"caster" ?
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
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 ?

Louis
0
nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 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'

Encore une fois, merci de votre aider
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
4 févr. 2007 à 19:30
Verifie ce qui s'appelle vtable dans ta classe objet mais si tu peux mettre un peu de code
ca serait plus simple. ..
0