[c++] probleme de comparaison de type d'objets derivés

probleme de comparaison de type d'objets derivés [c++] - C++ - Programmation

Marsh Posté le 24-04-2004 à 01:23:46    

Salut,
 
bon voila, j'ai une petite fonction qui m'embete un peu.
voici une idée du code :
 
...
for (int x = 0 ; x < v.size(); x++){
   Bloc* temp = v[x];
   if (ident == "NAME" ){
 if (typeid(temp) == typeid(BlocNAME)) return (BlocNAME*)temp;
   }
   if (ident == "FAMC" ){
 if (typeid(temp) == typeid(BlocFAMC)) return (BlocFAMC*)temp;
   }
...
 
le probleme se situe a la comparaison, les objets BlocNAME & BlocFAMC dérivent tous les deux de l'objet Bloc. L'objet temp récuperé peut être un BlocNAME, un BlocFAMC,etc .Cependant, lorsque c'est le cas, la comparaison echoue. Le compilo compare un objet de type Bloc avec un objet de type BlocNAME(/ou BlocFAMC) et par conséquent ne les trouve jamais du même type.
--> Comment tester dynamiquement le type d'un objet dérivé ???
 
Merci d'avance.

Reply

Marsh Posté le 24-04-2004 à 01:23:46   

Reply

Marsh Posté le 24-04-2004 à 02:47:05    

return (BlocNAME*)temp;
return (BlocFAMC*)temp;
 
- une fonction n'a qu'un seul type de retour
- ces transtypages sont ceux du C !
 
utilise dynamic_cast :
 

Code :
  1. for (std::vector<Bloc*>::size_type x = 0 ; x < v.size(); ++x)
  2. {
  3.    BlocNAME *obj1 = dynamic_cast<BlocNAME*>(v[x]);
  4.    if(obj1)
  5.    {
  6.       // travail avec le type BlocNAME
  7.    }
  8.    BlocFMAC *obj2 = dynamic_cast<BlocFMAC*>(v[x]);
  9.    if(obj2)
  10.    {
  11.       // travail avec le type BlocFMAC
  12.    }
  13. }


Message édité par blackgoddess le 24-04-2004 à 02:47:37

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 24-04-2004 à 11:22:05    

BlackGoddess a écrit :


Code :
  1. for (std::vector<Bloc*>::size_type x = 0 ; x < v.size(); ++x)




 
Quelle est la différence entre ton écriture et un simple :

Code :
  1. for (int x = 0 ; x < v.size(); ++x)


Reply

Marsh Posté le 24-04-2004 à 11:22:48    

bof. autant tirer parti aux maximun d'une petit feature à la con donc l'histoire est longue
 

Code :
  1. // je défini juste pour bien marteler le destructeur virtuel
  2. class Bloc
  3. {
  4. public:
  5.   virtual ~Bloc()
  6.   { }
  7. };
  8. class BlocNAME
  9.   : public Bloc
  10. {
  11. public:
  12.   virtual ~BlocNAME()
  13.   { }
  14. };
  15. class BlocFMAC
  16.   : public Bloc
  17. {
  18. public:
  19.   virtual ~BlocFMAC()
  20.   { }
  21. };
  22. #include <vector>
  23. int main()
  24. {
  25.   std::vector<Bloc*> v;
  26.   v.push_back(new BlocFMAC);
  27.   v.push_back(new BlocNAME);
  28.  
  29.   // bof
  30.   // y a des grosses discussions la dessus
  31.   // bien sur le size_type est bien,
  32.   // maitenant, pour la légèreté, size_t / unsigned devrait aller
  33.   // vu qu'on peut raisonnablement supposer que size_type   
  34.   // est un typdef d'un de ces types
  35.   for(std::vector<Bloc*>::size_type x = 0 ; x < v.size(); ++x)
  36.     { 
  37.       if(BlocNAME *obj1 = dynamic_cast<BlocNAME*>(v[x]))
  38.       {
  39. // travail avec le type BlocNAME
  40.       }
  41.      
  42.       if(BlocFMAC *obj2 = dynamic_cast<BlocFMAC*>(v[x]))
  43.       {
  44. // travail avec le type BlocFMAC
  45.       }
  46.     }
  47. }

Reply

Marsh Posté le 24-04-2004 à 11:23:54    

enidan a écrit :

Quelle est la différence entre ton écriture et un simple :

Code :
  1. for (int x = 0 ; x < v.size(); ++x)



size() renvoie un type entier non signé de type exact size_type.
1) donc int peut poser problème
2) int peut te faire un warning
3) on me dit que c'est sensé faire du meilleur code asm

Reply

Marsh Posté le 24-04-2004 à 11:28:03    

D'ac, merci Taz :)

Reply

Marsh Posté le 24-04-2004 à 12:48:29    

pk > t'avais les destructeurs virtuels ou pas ?

Reply

Sujets relatifs:

Leave a Replay

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