On vous l'a maintes fois répété : En C++, il n'est pas possible de connaître le type d'un objet durant l'exécution...et bien non, c'est tout a fait possible ! Moyennant la mise en ?uvre de RTTI (Run Time Type Information).
Les puristes vous diront que le langage objet est fait pour se délester des problèmes de typage grâce aux fonctions virtuelles. Certes, mais une astuce reste une astuce et des fois ça peut nous sortir du pétrin donc autant en faire profiter !
Le mécanisme de reconnaissance d'objet se réalise avec la classe type_info et l'opérateur typeid. La fonction name() renvoie le nom de la class préfixé par le mot class (suivant l'implémentation qui a été faite sur votre version).
Grâce à cette astuce vous ne serez plus obligé d'implémenter vous même les types de vos classe sous forme de chaîne dans la classe même (il y en a beaucoup qui le font).
Source / Exemple :
#include <iostream>
#include <typeinfo>
using namespace std;
class A
{
public:
A(){}
virtual ~A(){};
};
class B : public A
{
};
int main (int, char**)
{
A a;
B b;
cout << "la classe A est de type : " << typeid(A).name() << endl;
cout << "a est de type : " << typeid(a).name() << endl;
cout << "b est de type : " << typeid(b).name() << endl;
A a2;
cout << "type[a2] == type[a] ? " << (typeid(a) == typeid(a2)) << endl;
cout << "type[a2] == type[b] ? " << (typeid(a) == typeid(b)) << endl;
A * pa = new A;
A * pb = new B;
cout << "pa est de type : " << typeid(*pa).name() << endl;
cout << "pb est de type : " << typeid(*pb).name() << endl;
}
----------------------------------------------------------
la classe A est de type : class A
a est de type : class A
b est de type : class B
type[a2] == type[a] ? 1
type[a2] == type[b] ? 0
pa est de type : class A
pb est de type : class B
----------------------------------------------------------
Conclusion :
Vous remarquerez que la fonction name() renvoie le nom de la class préfixée par le mot class.
N'oubliez pas d'activer enable RunTime Type Info dans Visual Studio (option de compilation /GR) .
5 janv. 2007 à 18:09
Ca pourrait etre pratique d'avoir direcment le type de l'objet qui n'est pas correctement desalloue quand on utilise un memory manager.
Car tres souvent on oublie de detruit les Singletons.
10 déc. 2006 à 09:58
c'est quand même pas exactement ça le résultat produit (au moins avec gcc).
Cela affiche le nom de la classe avec des chiffres.
Par exemple :
1A
Ceci car il faut differencier les objets.
23 janv. 2006 à 17:56
admettons qu'on veuille écrire une classe de qui écrive des traces et des logs redirigés vers une sortie standard.
on veut quelque chose du type:
maclasse::MaMethodeQuiPlante()
{
MaTrace.Screen("maclasse::MaMethodeQuiPlante");
InstructionQuiPlante();
MaTrace.out();
}
il serait pratique de ne pas avoir à recopier à chaque fois ::MaMethodeQuiPlante
combinée à la surcharge d'opérateur cette astuce serait bien pratique si on pouvait récupérer le nom de la méthode
19 janv. 2006 à 18:51
Pour la 3ième fois -> une astuce est une astuce. Si des programmeurs ont créé cette bilbliothèque, c'est qu'il y avait un besoin. Mais je suis entièrement d'accord pour dire que la conception polymorphe est largement plus avantageuse.
Pour conclure, c'est une ASTUCE (et de 4!).
19 janv. 2006 à 18:10
Cordialement,
Xter.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.