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

  FORUM HardWare.fr
  Programmation
  C++

  Transtypage vector<A*> pour itération

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Transtypage vector<A*> pour itération

n°1814091
antsite
Je me souviens
Posté le 20-11-2008 à 01:16:11  profilanswer
 

:hello:  
 
Ma question porte sur le transtypage d'un vector<A*> en vector<B*> pour itérer correctement sur les objets de type B*.
 

Code :
  1. class A {};
  2. class B : public A {};
  3. class Mere {
  4. vector<A*> v;
  5. };
  6. class Fille : public Mere {
  7. Fille() {
  8. B *b1 = new B, *b2 = new B;
  9. v.push_back(b1); v.push_back(b2);
  10. }
  11. };


J'ai besoin maintenant dans une méthode de la classe Fille d'itérer sur le conteneur v (contenant des objets de type B* à ce moment).
 

Code :
  1. vector<B*> * w = reinterpret_cast<vector<B*>*>(&v);
  2. vector<B*>::iterator beg_it = w->begin();


Ce code marche bien mais le reinterpret_cast n'est pas du meilleur goût.
 
 
Je pensais à quelquechose du genre :
 
vector<B*>::iterator beg_it = dynamic_cast<vector<B*>::iterator>(v->begin());
 
mais j'ai du essayer sans succès.
 
Ou alors tout simplement, serait-il mieux d'itérer sur v normalement (après tout v ne contient que des pointeurs A* ou B* donc l'itération est identique (valeurs 32bits / 64bits) ?) et de caster au déréférencement de l'itérateur ?
vector<A*>::iterator it = v->begin()
B * b = dynamic_cast<B*>(*it);
 
merci pour vos lumières
 
edit: le forum n'aime pas les < > dans le code...


Message édité par antsite le 20-11-2008 à 01:22:02
mood
Publicité
Posté le 20-11-2008 à 01:16:11  profilanswer
 

n°1814107
Joel F
Real men use unique_ptr
Posté le 20-11-2008 à 07:58:03  profilanswer
 

tu ne peut pas dynamic_caster des iterator car il s'agi d'objet à part entiere et non de pointeur. Tu peut dynamic_caster leur dereferencement.
 
vector<B*>::iterator> it = v.begin();
B* pb = dynamic_cast<A*>( *i ) ;
 
Apres normalement si ta modelisation est correct, le dynamic_cast est inutile.

n°1814141
antsite
Je me souviens
Posté le 20-11-2008 à 09:33:48  profilanswer
 

Oui je comprends.
 
Je souhaite trier v. J'emploie pour ça la fonction callback suivante :
bool foo(B * x, B * y);
 
c'est précisement pour ça que je voulais caster pour avoir un itérateur sur B* et non A*. Dès lors comment appeler la fonction sort pour lui donner un itérateur sur le debut de v et sa fin ?
sort(v.begin(), v.end(), foo);
n'est pas correct car foo attend B* et non A*
 
voilà le sort() est vraiment mon objectif et c'est pour ça que je voulais caster mes itérateurs, et n'y arrivant pas j'avais décidé de reinterpret_caster directement v…
 
merci pour ton aide.


Message édité par antsite le 20-11-2008 à 09:51:14
n°1814233
Joel F
Real men use unique_ptr
Posté le 20-11-2008 à 11:16:20  profilanswer
 

ecrit foo pour qu'il attendent des A* et dynamic_cast à l'interieur

n°1814240
antsite
Je me souviens
Posté le 20-11-2008 à 11:27:40  profilanswer
 

d'accord, mais j'ai défini foo exprès dans B (statique) parce que foo ne peut trier que des B (foo accède un membre de B qui n'est pas dans A via ses paramètres), si on change sa signature avec des A*, n'aura-t-on pas une mauvaise sémantique ? et puis surtout on n'a pas un problème de securité ? car je pourrais appeler foo sur des A* ce qui est impossible/interdit.

n°1814242
KangOl
Profil : pointeur
Posté le 20-11-2008 à 11:36:22  profilanswer
 

tu peux pas juste surcharger l'opérateur < ?


---------------
Nos estans firs di nosse pitite patreye...
n°1814261
antsite
Je me souviens
Posté le 20-11-2008 à 11:58:08  profilanswer
 

bonne idée mais non ce n'est pas possible car j'ai plusieurs tris de la sorte qui fonctionnent sur différents membres de B.

n°1814375
Joel F
Real men use unique_ptr
Posté le 20-11-2008 à 14:03:31  profilanswer
 

antsite a écrit :

je pourrais appeler foo sur des A* ce qui est impossible/interdit.


 
bah le dynamic_cast t'empeche de le faire de toute façon

n°1814376
Joel F
Real men use unique_ptr
Posté le 20-11-2008 à 14:03:44  profilanswer
 

KangOl a écrit :

tu peux pas juste surcharger l'opérateur < ?


la surcharge ne résout pas le polymorphisme

n°1814401
KangOl
Profil : pointeur
Posté le 20-11-2008 à 14:25:34  profilanswer
 

Joel F a écrit :


la surcharge ne résout pas le polymorphisme


effectivement
 
pour arriver a ses fins, il doit passer par une fonction wrapper qui va faire les dynamic_cast


---------------
Nos estans firs di nosse pitite patreye...
mood
Publicité
Posté le 20-11-2008 à 14:25:34  profilanswer
 

n°1814415
antsite
Je me souviens
Posté le 20-11-2008 à 14:33:46  profilanswer
 

Joel F a écrit :


 
bah le dynamic_cast t'empeche de le faire de toute façon


 
en effet je n'y avais pas pensé.
 
merci pour votre aide, je vais réfléchir à tout ça.
 
:calimero:


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

  Transtypage vector<A*> pour itération

 

Sujets relatifs
[C++][Vector & String][Memoire] Excep sur ~ d'un vecteur de string> 15Problème insoluble de transtypage
std vector : tracking des adresses des objets contenusvector : problème accès aux caractères d'1 élé
Ajout d'un vector qui contient lui même un vectorConcaténer deux vector
Vector en C++ - Optimisation de la recherche[C/C++] Copie d'un std::vector
[Résolu] porté d'une variable vector[Résolu][Struts] itération pour créer des liens + identifiants
Plus de sujets relatifs à : Transtypage vector<A*> pour itération


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