Bonjour, je cherche un moyen propre de vérifier si mon objet est de tel ou tel type. typeid ne peut pas fonctionner car ces objets héritent du même.
Bonjour, je cherche un moyen propre de vérifier si mon objet est de tel ou tel type. typeid ne peut pas fonctionner car ces objets héritent du même.
Une solution : implémenter une fonction virtuelle GetTypeName() const qui renvoie le nome de la classe.
Avec une macro qui va bien, pour simplifier, ça peut donner ça :
A +
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #define DECLARE_TYPE(Class) \ virtual std::string GetTypeName() const {return #Class; } //----------------------------------------------------------- // IObject : Base class //----------------------------------------------------------- struct IObject { IObject() {} virtual ~IObject() {} // Fonction to get the real type of the Class. virtual std::string GetTypeName () const = 0; // Polymorphic copy the object virtual boost::shared_ptr<IObject> Clone () const { throw std::exception("This object is no clonable"); } };
dynamic_cast<> devrait permettre ça (s'il s'agit juste de comparer deux types entre eux). C'est notamment le cas si les objets sont de la même hierachie.
RTTI doit être activé (ce n'est pas le cas dans les settings par défaut sous Visual Studio, mais c'est le cas avec g++).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class A { }; class B : public A { }; class C : public A { }; class D : public B { }; A* a; ... D* d = dynamic_cast<D*>(a); // d == NULL si a n'est pas un objet du type D C* c = dynamic_cast<C*>(a); // c == NULL si c n'est pas un objet du type C
Ou es-ce que j'ao manqué quelque chose dans ta question ?
[FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.
Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.
Il demande un moyen propre ... "pourquoi faire ?" me parait être la meilleure réponse à sa question. S'il vient du Java il risque d'être habitué aux void*^WObject et non au typage bien plus strict des templates, plus les cas comme le double-dispatching qui peuvent-être résolu avec un pattern visiteur, ou encore le fait que le C++ dispose d'une meilleure sémantique de valeur ce qui lui permet d'esquiver les prises de choux que la communauté Java expérimente avec des fonctions comme equals (qui est un double dispatching dégénéré qui se résout avec les templates et 0 héritage en C++).
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Bonjour,
type_id retourne le type dynamique de l'objet si le type statique est polymorphe :
Sortie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 #include<typeinfo> #include <iostream> struct polymorphic_base { virtual ~polymorphic_base(){} }; struct polymorphic_derived : public polymorphic_base { }; struct non_polymorphic_base { ~non_polymorphic_base(){} }; struct non_polymorphic_derived : public non_polymorphic_base { }; template<class derivee, class base> void dump() { base b; derivee d; base &rb=b; base &rd=d; std::cout<<typeid(b).name()<<"\n"; std::cout<<typeid(d).name()<<"\n"; std::cout<<typeid(rb).name()<<"\n"; std::cout<<typeid(rd).name()<<"\n"; } int main() { std::cout<<"polymorphe : \n"; dump<polymorphic_derived,polymorphic_base>(); std::cout<<"non polymorphe : \n"; dump<non_polymorphic_derived,non_polymorphic_base>(); return 0; }
[EDIT] la réponse de Luc est la plus pertinente : pourquoi faire ?polymorphe :
struct polymorphic_base
struct polymorphic_derived
struct polymorphic_base
struct polymorphic_derived
non polymorphe :
struct non_polymorphic_base
struct non_polymorphic_derive
struct non_polymorphic_base
struct non_polymorphic_base
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
je dois effectuer un traitement spécifique suivant l'objet. Si l'objet dérivé est de tel type je fais ceci, s'il est de se type, je fais cela...
La réponse de "poukill" me semble le plus adapter, a moins que j'ai mal compris le dynamic_cast<>
J'vais aller faire quelques testes.
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Partager