vector contenant object utilisant polymorphisme, help

vector contenant object utilisant polymorphisme, help - C++ - Programmation

Marsh Posté le 26-11-2008 à 13:43:51    


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
Reply

Marsh Posté le 26-11-2008 à 13:43:51   

Reply

Marsh Posté le 26-11-2008 à 13:52:54    

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

Marsh Posté le 26-11-2008 à 14:14:54    

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
Reply

Marsh Posté le 26-11-2008 à 14:18:52    

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

Reply

Marsh Posté le 26-11-2008 à 17:13:34    

boost::variant

Reply

Marsh Posté le 26-11-2008 à 17:45:30    

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
Reply

Marsh Posté le 26-11-2008 à 18:37:05    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed