[C++] comment faire pour ...

comment faire pour ... [C++] - Programmation

Marsh Posté le 16-06-2001 à 14:42:43    

savoir si un pointeur pointe vers une instance de classe dérivée d'une autre ?  
 
Par ex :  
 
class CTrucdebase
   {
   int i;
   };
 
class CTruc : public CTrucdebase
   {
   float f;
   };
 
void *ptr;  
CTruc truc;  
ptr = (void*)&truc;
et là je voudrais savoir à partir de ptr, si l'élément vers lequel il pointe est dérivé de CTrucdebase ... (peu importe si le code est dégueulasse, je voudrais juste savoir si c'est possible)

Reply

Marsh Posté le 16-06-2001 à 14:42:43   

Reply

Marsh Posté le 16-06-2001 à 17:59:56    

cherche sur google rtti (standard c++), ou iskindof. y'a moyen d'implémenter un iskindof() très simplement, cherche !

Reply

Marsh Posté le 16-06-2001 à 22:53:51    

Si t'as pas beaucoup de classes, tu peux faire
 
 
 
class A
{
public:
   enum Type {TypeA, TypeB, etc...};
...
   Type ChuideQuelType(){return A;}
};
 
class B: public A
{
    Type ChuideQuelType(){return B;}
};
 
 
main...
A* truc;
...
if (A->ChuideQuelTyp()==A::TypeA)
...
 
 
etc...


---------------
-----------------------
Reply

Marsh Posté le 16-06-2001 à 23:18:26    

ben en fait si j'ai potentiellement bcp de classe puisque ça doit être évolutif avec des nouvelles classes, donc marche pas.
Pour ce qui est du iskindof(), j'ai cherché dans la MSDN, mais c'est très confut, et d'après ce que j'ai compris c'est en MFC, pour les classes CObject, et comme j'utilise pas MFC, je sais pas comment faire ...

Reply

Marsh Posté le 16-06-2001 à 23:27:29    

tu peux faire ton iskindof à la main sans problème. il te faut simplement un identifiant unique par classe. tu peux utiliser aux choix un entier , un guid , une string, etc ....
 
exemple avec une string :
 
class Base
{
  bool IsKindOf(char* str)
  {
    return !strcmp(str, "Base" ) ? true : false;
  }
};
 
class Derived : public Base
{
  bool IsKindOf(char* str)
  {
    return !strcmp(str, "Derived" ) ? true : Base::IsKindOf(str);
  }
}
 
etc ...
 
instanceOfBase->IsKindOf("base" ) retourne true
instanceOfBase->IsKindOf("supermegacoolclass" ) retourne false
instanceOfDerived->IsKindOf("supermegacoolclass" ) retourne false
instanceOfDerived->IsKindOf("Derived" ) retourne true
instanceOfDerived->IsKindOf("Base" ) retourne true
 
c'est bon ?

Reply

Marsh Posté le 16-06-2001 à 23:40:18    

euh ouais, ça marcherait, mais en fait je voudrais savoir s'il n'y aurait pas un truc prévu exprès pour en C++, pour m'éviter d'écrire un fonction IsKindOf pour toutes les fonctions de mon projet !

Reply

Marsh Posté le 17-06-2001 à 01:00:25    

le trux exprès c'set la rtti.
c'est supporté en standard depuis 1998, et vas voir
http://www.dinkum.com/htm_cpl/index.html
sous la rubrique
<typeinfo>
 
et ça marche, mais attention, ça rajoutes qqes octets à une classe, alors si t'es beaucoup d'instances d'un classe très petite, c'est chiant


---------------
-----------------------
Reply

Sujets relatifs:

Leave a Replay

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