Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RECONNAISSANCE DE TYPES D'OBJETS EN C++


Information sur la source

Catégorie :Astuces Classé sous : objet, type, connaître, reconnaître, rtti Niveau : Expert Date de création : 18/01/2006 Date de mise à jour : 18/01/2006 11:17:45 Vu : 9 505

Note :
Aucune note

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note


Description

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

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

Historique

18 janvier 2006 11:03:18 :
correction orthographique
18 janvier 2006 11:17:45 :
modification de la source par rapport au commentaire de cosmobob [objets dynamiques]

Commentaires et avis

signaler à un administrateur
Commentaire de cosmobob le 18/01/2006 11:00:37

salut,
ton exemple n'a pas beaucoup d'interet, car l'information de typage est ici connu a la compilation et pas a l'execution (pas pendant le runtime) puisque tes objets sont pas alloués dynamiquement.


Pour faire quelque chose d'un peu plus malin:

class A
{
public:
     virtual ~A(){}; // au moins une fonction virtual necessaire pour que le compilo  utilise une table de typage dynamique a l'execution

};
  
class B : public A
{
};


A* ptr1 = new A;
A* ptr2 = new B; // licite car B derive de A


cout << "ptr1 est de type : " << typeid(*ptr1).name() << endl;
cout << "ptr2 est de type : " << typeid(*ptr2).name() << endl;

on voit que pour bien obtenir ce qu'il faut ( ptr1 de class A, ptr2 de class B), il faut avoir activé enable RunTime Type Info dans vs7.

et voila ... update ta source avec cette remarque

a+

signaler à un administrateur
Commentaire de poppyto le 18/01/2006 11:18:53 administrateur CS

Effectivement avec les objets dynamique VS envoie un warning, il faut rajouter /GR aux options de compilation, j'ai mis ma source à jour ^^.
Merci

signaler à un administrateur
Commentaire de luhtor le 19/01/2006 15:13:59

Il me semblait que connaitre le type à l'éxécution n'était pas utile et surtout, refletait une mauvaise programmation. non ?

signaler à un administrateur
Commentaire de poppyto le 19/01/2006 16:10:46 administrateur CS

>>Luthor

Tu as aussi le droit de lire l'explication, je cite:

"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 !"

Et par ailleurs je suis du même avis que toi ^^ mais une astuce reste une astuce.

signaler à un administrateur
Commentaire de luhtor le 19/01/2006 17:38:38

Oui j'avoue j'ai seulement lu l'explication la deuxième fois que j'ai ouvers cette page :)

signaler à un administrateur
Commentaire de xterminhate le 19/01/2006 18:10:58

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

Cordialement,
Xter.

signaler à un administrateur
Commentaire de poppyto le 19/01/2006 18:51:07 administrateur CS

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

signaler à un administrateur
Commentaire de koda_xii le 23/01/2006 17:56:40

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

signaler à un administrateur
Commentaire de b Oo le 10/12/2006 09:58:18

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.

signaler à un administrateur
Commentaire de profringo666 le 05/01/2007 18:09:04

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.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

structure d'un fichier video [ par jopop ] Je cherche à connaître la structure d'un fichier video du type AVI, voire plus simple s'il en est. De la même manière que l'on trouve cette structure Combien pèse un objet de type bool? [ par MoDDiB ] Combien pèse un objet de type bool car mon liver omet de le dire :( ? selon moi 1 bit mais bon on ne sait jamais ^^Merci pour la réponse (oui je sais Question sur le type "Variant" [ par oberown ] J'utilise une api, où je recupere une collection d'objet de type Banane Pour récuperer l'objet il faut que j'utilise un *variant. Comment caster mon v déterminer dynamiquement le type d'un objet pointé [ par feanor11 ] Sachant qu'un pointeur est capable de pointer sur un objet d'un type d&#233;riv&#233; &#224; son type respectif (si A est d&#233;riv&#233;e de B, A* p une classe static [ par Adeon ] bonjour a tous!je suis sur le developpement d'un jeux.certaine classe ne contienne qu'un seul objet comme par exemple la classe Interface, ou encore l Classe liste chaînée générique [ par marik7335 ] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Salut &#224; tous, &nbsp; Je souhaite g&#233;rer un parc de v&#233;hicules contenant des motos et des voitures. [STL] parcours de liste. [ par herlockg ] Bonjour,Je voudrais pouvoir parcourir une liste d'objet de type personne et récupérer un des objets de ma liste pour la mettre dans un objet (de même test du pointeur [ par jeltimed ] bonjour .en fait je suis débutant en c++ et je voulais juste savoir est ce que ya moyen d'appliquer la logique suivant en c++: si pointeur pointe determiner le type d'un objet et réutiliser ce type [ par feanor11 ] Soit un objet O, dont on ne connait pas le type. On peut d&#233;terminer son type &#224; l'aide de la fonction typeid(), retournant un objet de type L'impression d'un objet de type Cview [ par eeabadr ] Bonjour à tous je veut savoir comment gérer l"impression à partir d'un objet de type Cview on dispose d'un ensemble de méthodes (OnPreparPrinting(),On


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.