comment faire pour ... [C++] - Programmation
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 !
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...
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 ...
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 ?
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 !
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
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)