Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1220 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  vector contenant object utilisant polymorphisme, help

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

vector contenant object utilisant polymorphisme, help

n°1816987
cybercouf
Posté le 26-11-2008 à 13:43:51  profilanswer
 


Je veut avoir une liste d'elements differents, par exemple de string bool et int.
J'ai donc ma classe GenericValue, utilisant polymorphisme (pour etre manipule comme simplement "Generic" ), et template pour eviter d'ecrire une classe fille par type que je mets dedans.
 

Code :
  1. class Generic
  2. {
  3. public:
  4.  virtual ~Generic(){};
  5.  virtual const type_info& getType() =0;
  6. };
  7. template<class T>
  8. class GenericValue : public Generic
  9. {
  10. public:
  11.  GenericValue() {
  12.   _value = NULL;
  13.  };
  14.  GenericValue(T * val) {
  15.   _value = val;
  16.  };
  17.  virtual ~GenericValue() {
  18.   if (_value != NULL)
  19.    delete _value;
  20.  };
  21.  virtual const type_info& getType() { return typeid(*this); };
  22.  T * get() {
  23.   return _value;
  24.  };
  25.  T * getValue() {
  26.   return _value;
  27.  };
  28. private:
  29.  T * _value;
  30. };


 
Donc l'idee est que je mets mes elements dans un vector disont.

Code :
  1. vector<Generic*> vec(4,NULL);
  2. vec[0] = new GenericValue<string>(new string("hfr" ));
  3. vec[1] = new GenericValue<int>(new int(22));
  4. //super, j'ai mes chien et chats dans la meme boite
  5. GenericValue<string>* val1 = dynamic_cast<GenericValue<string>*>(vec[0]);
  6. // et je retrouve ma valeur sans probleme


 
Donc comme ca, ca marches.
Mais, si je veux mettre l'object lui meme dans mon vector et non un pointeur plus possible:
 

Code :
  1. vector<Generic> vec(4);
  2. vec[0] = GenericValue<string>(new string("hfr" ));


 
Compile pas, car il veut instancier Generic qui est virtuel pure, pour remplir le vector de valeur par defaut.
Seulement je veux que le destructeur de GenericValue<T> soit appele lors de la destruction d'un Generic, donc il me faut ce virtual pure.
 
Suis-je oblige du coup d'utiliser que des pointeurs sur Generic et jamais directement de reference?
Ou dois-je par exemple agrandir d'un mon vector pour y ajouter directement une instance de GenericValue<T> ? (mais dans ce cas il me semble que quand je redimm le vector d'un il cherche quand meme a creer une instance defaut de Generic)


---------------
Habillé par Canon, Gallerie web v1.0
mood
Publicité
Posté le 26-11-2008 à 13:43:51  profilanswer
 

n°1817005
0x90
Posté le 26-11-2008 à 13:52:54  profilanswer
 

Tu ne peut pas mettre dans un vecteur des objets de classe différentes, chaque classe peut avoir des objet de taille différente (dans ton cas spécifique comme les Generic<truc> ne contiennent qu'un pointeur, la taille de l'objet ne dépends pas du type truc), du coup les "cases" du vecteur devraient avoir des tailles différentes.  
 
Or derrière le vecteur y'a un simple tableau ala C, dans lequel toutes les cases font la même taille (c'est obligatoire, pour indexer la case n d'un tableau tu fais avancer un pointeur de n*(taille de la case)).


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1817027
cybercouf
Posté le 26-11-2008 à 14:14:54  profilanswer
 

Merci de ta reponse :jap:
cependant je ne comprend pas quand tu dis:

0x90 a écrit :

Generic<truc> ne contiennent qu'un pointeur, la taille de l'objet ne dépends pas du type truc), du coup les "cases" du vecteur devraient avoir des tailles différentes.


 
Justement ici un GenericValue<string> a la meme taille qu'un GenericValue<int>, mais le compilo ne le sait pas en avance?
 
Je peux pas non plus avoir un vector<GenericValue>() vu que GenericValue<T> utilises un template.
 
Je pourrais utiliser un pointeur sur void pour eviter le template, mais je pourrais plus faire mon delete (car sur void*) dans mon destructeur.
 
 
Je sens que je vais devoir garder mes pointeurs, et donc gerer manuellement la memoire quand on vide cette liste.


---------------
Habillé par Canon, Gallerie web v1.0
n°1817031
Taz
bisounours-codeur
Posté le 26-11-2008 à 14:18:52  profilanswer
 

Le polymorphime ça passe par les pointeurs ou les références. Comme les conteneurs STL sont orientés valeur, ça ne peut pas marcher.
 
Pour ce que tu fais en particulier, va voir chez boost (any, variant, etc).
 
Et des shared_ptr surtout

n°1817186
Joel F
Real men use unique_ptr
Posté le 26-11-2008 à 17:13:34  profilanswer
 

boost::variant

n°1817227
cybercouf
Posté le 26-11-2008 à 17:45:30  profilanswer
 

l'idee est d'avoir un truc un peu comme boost::variant en plus simple et sans utiliser aucune lib genre boost
 
merci des conseils tout de meme, je vais garder comme ca et utiliser pointeur seulement et donc ecrire un peu de code pour la memoire du coup


---------------
Habillé par Canon, Gallerie web v1.0
n°1817254
Joel F
Real men use unique_ptr
Posté le 26-11-2008 à 18:37:05  profilanswer
 

bah se priver de boost pour ecrire du caca est tout sauf productif


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  vector contenant object utilisant polymorphisme, help

 

Sujets relatifs
mettre en forme un fichierpeobléme de deconnexion en utilisant JXTA
Algo en rapport avec un sudoku, helpTranstypage vector<A*> pour itération
STD type et polymorphisme.HELP
help pleasebatch : bloqué et à rendre... help svp!!
SimpleXML Object vers Array ?HELP dr java
Plus de sujets relatifs à : vector contenant object utilisant polymorphisme, help


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR