vector de pointeur sur classe polymorphique - C++ - Programmation
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.
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
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 :
|
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.
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 :
|
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 :
|
Marsh Posté le 27-05-2009 à 08:30:44
Glock 17Pro a écrit : |
Non c'ets un pb d'interface comem montré plsu haut
Glock 17Pro a écrit : |
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 ???
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)'
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