Vector de plusieurs types [Résolu]

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

Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

non c'est bon j'ai trouvé, j'avais oublié de mettre le = 0 après virtual ...

Merci :)
Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
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
Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
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
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

d'accord. Donc si je comprends bien : on fait un vector contenant en fait les adresses des variables, n'est ce pas ?
Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
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
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

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

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 ...
Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
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 ...
}

                        
                
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

merci

mais pq avoir une virtual ?
Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
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
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

"caster" ?
Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
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
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

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
Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
Verifie ce qui s'appelle vtable dans ta classe objet mais si tu peux mettre un peu de code
ca serait plus simple. ..