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

  FORUM HardWare.fr
  Programmation
  C++

  DownCast???

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

DownCast???

n°1085225
AsTro
Posté le 16-05-2005 à 11:31:30  profilanswer
 

Salut,
Je ne sais pas si j'utilise le bon terme (DownCast) mais j'ai un petit souci.
En fait j'ai une classe "element" qui est abstraite et j'ai des sous classes concretes elementA, elementB et elementC.
J'ai une autre classe abstraite "collecteur" qui est sensée travailler sur un élément spécifique. Selon l'élément concret je ne veut pas faire les memes opérations. J'ai donc les classes concrete collecteurA, collecteurB et collecteurC. Elles implémentent toutes la fonction exec_query().
 
Ensuite j'ai une classe fabriquecollecteur qui définie 3 fonctions :
       

Code :
  1. collecteurA *creerCollecteur(elementA *eltA);
  2. collecteurB *creerCollecteur(elementB *eltB);
  3. collecteurC *creerCollecteur(elementC *eltC);


 
Jusque la ca peut aller, mais le probleme c'est que lorsque je créer mon collecteur je ne connait pas le type concret de mon element, je sais juste qu'il est du type élément. Exemple :
         
       

Code :
  1. element *eltA = new elementA();
  2. FabriqueCollecteur *fab = new FabriqueCollecteur();
  3. collecteur *collecteur1 = fab->creerCollecteur(eltA);
  4. collecteur1->exec_query();


 
 
et la j'ai une belle erreur de compilation :  
error C2664: 'collecteurA *FabriqueCollecteur::creerCollecteur(elementA *)' : cannot convert parameter 1 from 'element *' to 'elementA *'
 
Ce que je comprend mais comment résoudre cette erreur?
 
Il y a bien des solutions en modifiant l'architecture et en spécifiant a chaque élément son collecteur mais j'aimerais que cette premiere solution fonctionne.
 
Si vous le souhaitez, vous pouvez tester les sources en prenant ca : sources


Message édité par AsTro le 16-05-2005 à 11:33:27
mood
Publicité
Posté le 16-05-2005 à 11:31:30  profilanswer
 

n°1085232
Taz
bisounours-codeur
Posté le 16-05-2005 à 11:36:59  profilanswer
 

dynamic_cast<T*>( ... ) qui renvoie 0 si il échoue
dynamic_cast<T&>( ... ) qui lui lance une exception std::bad_cast
 
mais enfait, tu ferais mieux de t'intéresser au design pattern visitor.
 
et la question qui tue : ton destructeur est-il bien virtuel ?

n°1085239
AsTro
Posté le 16-05-2005 à 11:40:58  profilanswer
 

Taz a écrit :

dynamic_cast<T*>( ... ) qui renvoie 0 si il échoue
dynamic_cast<T&>( ... ) qui lui lance une exception std::bad_cast
 
mais enfait, tu ferais mieux de t'intéresser au design pattern visitor.
 
et la question qui tue : ton destructeur est-il bien virtuel ?


 
 
Euh je sais pas... Ca change quoi que le destructeur soit declare virtual ou non?
 
Tu peux me donner plus d'infos sur "dynamic_cast"? Tu le met où?
 
Tu penses que ce que je souhaite faire correspond au pattern visiteur? Je vais regarder ca, dans mon beau livre Design Patterns :p


Message édité par AsTro le 16-05-2005 à 11:41:27
n°1085240
Taz
bisounours-codeur
Posté le 16-05-2005 à 11:43:55  profilanswer
 

/me retourne se coucher

n°1085361
AsTro
Posté le 16-05-2005 à 13:52:13  profilanswer
 

Pour faire un dynamic_cast il faut quand meme connaitre le type de destination, dans mon cas elementA, elementB ou elementC

n°1085433
Taz
bisounours-codeur
Posté le 16-05-2005 à 14:48:28  profilanswer
 

et ben il faut essayer les 3 ... je vois pas comment tu veux faire autrement ...
 
 
if(ElementA* a = dynamic_cast<ElementA*>(e))
{
  // code pour un ElementA
}
else if(ElementB* b = dynamic_cast<ElementA*>(e))
{
  // code pour un ElementB
}
else if(ElementC* c = dynamic_cast<ElementA*>(e))
{
  // code pour un ElementC
}
else
{
  // mais c'est quoi ce truc ?
}
 
sinon, penche toi sur le visitor

n°1085771
AsTro
Posté le 16-05-2005 à 17:08:48  profilanswer
 

Taz a écrit :

et ben il faut essayer les 3 ... je vois pas comment tu veux faire autrement ...
 
 
if(ElementA* a = dynamic_cast<ElementA*>(e))
{
  // code pour un ElementA
}
else if(ElementB* b = dynamic_cast<ElementA*>(e))
{
  // code pour un ElementB
}
else if(ElementC* c = dynamic_cast<ElementA*>(e))
{
  // code pour un ElementC
}
else
{
  // mais c'est quoi ce truc ?
}
 
sinon, penche toi sur le visitor


Ok, c'est bien ce que je craignais, je veux justement éviter les switchs.
 
Je crois que je vais me rabattre vers une sorte de pattern visitor.
 
Merci bien ;)

n°1086100
blackgodde​ss
vive le troll !
Posté le 16-05-2005 à 22:00:51  profilanswer
 

pour le destructeur virtuel, fait un petit test :  
 
(ecrit a l'arrache)

Code :
  1. #include <iostream>
  2. struct mere
  3. {
  4.   mere() { std::cout << "mere::mere\n"; }
  5.   (virtual) ~mere() { std::cout << "mere::~mere\n"; }
  6. };
  7. struct fille : mere
  8. {
  9.   fille() { std::cout << "fille::fille\n"; }
  10.   (virtual) ~fille() { std::cout << "fille::~fille\n"; }
  11. };
  12. int main()
  13. {
  14.   mere *m = new fille();
  15.   delete m;
  16. }


 
essaye avec et sans les virtual, tu comprendras


---------------
-( BlackGoddess )-
n°1086223
AsTro
Posté le 17-05-2005 à 01:02:22  profilanswer
 

Effectivement c'est utile  :jap:

n°1086772
AsTro
Posté le 17-05-2005 à 15:37:38  profilanswer
 

En fait, le dynamic_cast c'est comme un instanceof en Java?

mood
Publicité
Posté le 17-05-2005 à 15:37:38  profilanswer
 

n°1086783
Taz
bisounours-codeur
Posté le 17-05-2005 à 15:44:52  profilanswer
 

ou l'inverse.

n°1086786
AsTro
Posté le 17-05-2005 à 15:46:11  profilanswer
 

Taz a écrit :

ou l'inverse.


 
aussi  :jap:


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

  DownCast???

 

Sujets relatifs
[VB6]DownCast 
Plus de sujets relatifs à : DownCast???


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)