vector de pointeur sur classe polymorphique

vector de pointeur sur classe polymorphique - C++ - Programmation

Marsh Posté le 26-05-2009 à 20:37:40    

Hi,
 
je vais rencontrer des pbm si j'utilise un vector de pointeur sur une hierarchie de classes polymorphiques, dont une des filles de cette hierarchie contient également par composition une hierarchie d'objets polymorphiques ?
 
Dans boost ils évoquent "the polymorphic class problem" pour vendre leur pointer container.
 
Je vois pas trop où un vector de pointeur dans le contexte que j'ai décris va me poser problème? QUelqu'un pour méclairer ?
 
Merci

Reply

Marsh Posté le 26-05-2009 à 20:37:40   

Reply

Marsh Posté le 26-05-2009 à 20:59:21    

plusieurs raisons :
 - le classique A-is-a-B n'implique container-of-A-is-container-of-B
 - l'oubli potentiel du destructeur virtuel qui rend un peu sexy la libération des éléments du conteneur
 - le fait que pour faire propre en terme d'ownership il faut un vector<clone_ptr<A>> qui est affreusement lent.

Reply

Marsh Posté le 27-05-2009 à 00:01:08    

1) ça implique quoi alors concrètement ? j'ai une perte de données ? Dans mon cas je stocke des pointeurs sur la classe de base (qui est abstraite en passant).

 

3), tu veux dire que le vecteur n'est pas totalement propriétaire des objets qu'il contient? mais admettons que l'on alloue notre hierarchie principal via un new dans une fonction, et que dans cette même fonction, on ajoute ces adresses au vecteur , in fine seul le vecteur détient l'adresse.donc je vois pas le soucy du ownership :/

Message cité 1 fois
Message édité par Glock 17Pro le 27-05-2009 à 07:58:09
Reply

Marsh Posté le 27-05-2009 à 07:52:43    

Une pomme est un fruit.
Un panier à pommes n'est pas un panier à fruits. Car tu peux mettre une orange dans un panier à fruit, mais pas dans un panier à pomme.
 
Désolé pour le coté enfantin de l'exemple, mais au moins c'est intuitif.
D'où le célèbre problème :
 

Code :
  1. Orange o[ 42 ];
  2. void f( Fruit* f, int nb )
  3. {
  4.     ...
  5. }
  6. f( o, 42 );


 
qui va surement bugger car un tableau de Orange n'est pas lisible comme un tableau de Fruit (car sizeof(Fruit) != sizeof(Orange)) alors que ça compile très bien.

Reply

Marsh Posté le 27-05-2009 à 08:06:06    

Ah... ça m'avait échapper ce point  :
 
et le problème est le même avec un stl container?
 

Code :
  1. vector<Orange*> o;
  2. for 0 to 42 : push_back( new elem ) //allocated on the heap
  3.   void f( vector<Fruit*>& f, int nb )
  4. {
  5.      ...
  6. }
  7. f( o, 42 ); //Découpage d'objet ?


 
EDIT: ça compile peut être même pas remarque, ( ça serait le 1) de Joel ? ).. mais je suis pas sûr d'avoir ce cas là dans mon code, je ne manipule que des vector<classe de base*> qui sont polymorphique effectivement mais là dans ton cas tu manipule explicitement un tableu de pointeur sur une classe dérivée, c'est un peu un cas à part peut être
 
en gros je fais plutôt :
 
 

Code :
  1. vector<Fruit*> o;
  2. for 0 to 42 :
  3. push_back( new Banane ) 
  4. push_back( new Kiwi ) 
  5. push_back( new Mangue ) 
  6. //...
  7. void f( vector<Fruit*>& f, int nb )
  8. {
  9.     ...
  10. }
  11. f( o, 42 ); //Découpage d'objet ?


Message édité par Glock 17Pro le 27-05-2009 à 08:12:47
Reply

Marsh Posté le 27-05-2009 à 08:30:44    

Glock 17Pro a écrit :


1) ça implique quoi alors concrètement ? j'ai une perte de données ? Dans mon cas je stocke des pointeurs sur la classe de base (qui est abstraite en passant).


 
Non c'ets un pb d'interface comem montré plsu haut
 

Glock 17Pro a écrit :


3), tu veux dire que le vecteur n'est pas totalement propriétaire des objets qu'il contient? mais admettons que l'on alloue notre hierarchie principal via un new dans une fonction, et que dans cette même fonction, on ajoute ces adresses au vecteur , in fine seul le vecteur détient l'adresse.donc je vois pas le soucy du ownership :/


vector<T*> alloue un tableau de pointeur mais n'alloue pas le contenu des pointeurs, ca iomplqiue que lorsque tu detruit ton vecteur, qui deruit les poineurs ???

Reply

Marsh Posté le 27-05-2009 à 09:11:10    


vector<T*> alloue un tableau de pointeur mais n'alloue pas le contenu des pointeurs, ca iomplqiue que lorsque tu detruit ton vecteur, qui deruit les poineurs ???  
 
ok, ownership dans ce sens. (oui je fais ce qu'il faut pour les détruires)'

Reply

Sujets relatifs:

Leave a Replay

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