Reconnaissance de types d'objets en c++

Soyez le premier à donner votre avis sur cette source.

Snippet vu 21 459 fois - Téléchargée 33 fois

Contenu du snippet

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) .

A voir également

Ajouter un commentaire Commentaires
Messages postés
6
Date d'inscription
lundi 30 juin 2003
Statut
Membre
Dernière intervention
5 janvier 2007

Moi ce qui m'interesserais ca serait de retrouver le type de l'objet alloue.
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.
Messages postés
1
Date d'inscription
vendredi 28 mai 2004
Statut
Membre
Dernière intervention
10 décembre 2006

Bonjour,
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.
Messages postés
9
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
23 janvier 2006

bonjour

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
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

> xterminhate

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!).
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

Donne moi un exemple d'application qui ne puisse pas avantageusement être remplacé par une conception à base de polymorhpisme d'execution.

Cordialement,
Xter.
Afficher les 10 commentaires

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.