Bonjour à tous...
Je cherche une fonction qui vérifie si un objet est une instance d'une classe passé en paramètre, ou qui renvoie la classe d'un objet passé en paramètre, un peut à la manière du instanceOf() de Java.
Merci d'avance pour votre aide.
Bonjour à tous...
Je cherche une fonction qui vérifie si un objet est une instance d'une classe passé en paramètre, ou qui renvoie la classe d'un objet passé en paramètre, un peut à la manière du instanceOf() de Java.
Merci d'avance pour votre aide.
Dans quelle situation as tu besoin de faire ça ? Si l'instance est passee en paramètre, alors tu connais son tpe, du moins de base ?
Sinon y'a pas d'introspection en C++. Tu peux utiliser dynamic_cast pour tenter des conversions ou bien jouter avec le RTTI et typeid.
Un exemple : supposons une interface Joueur, implémentée en deux classes : Humain et Machine... Bien sûr, je crée deux pointeurs vers Joueur, mais l'objet pointé peut très bien être Humain ou Machine, vu qu'ils implémentent Joueur. Le but est donc de savoir si le Joueur est en fait un Humain ou une Machine...
En ce qui concerne le typeid, j'avais trouvé cela après quelques recherches, mais j'ai du mal à saisir son fonctionnement, et le type_info qui va avec...
Une solution classique consiste à créer une fonction virtuelle pure "type()" dans Joueur que les classes filles supplantent afin de renvoyer le type de la classe ce qui permet de faire un dynamic_cast voire un static_cast derrière.
Sinon dynamic_cast avec test de résultat.
Merci, je crois que ta solution reste la plus simple et la moins couteuse...
Pour l'exemple des échecs, le but est justement de ne pas savoir qui est l'humain et qui est la machine. Tout ce qu'on demande à ces classes, c'est de savoir produire le coup suivant.
Tout ça pour dire que même si le downcast (d'un type de base vers un type dérivé) est possible en C++, c'est souvent une mauvaise idée (pareil qu'en Java, d'ailleurs). Pourquoi ? Par exemple, si on décide plus tard de créer un joueur MachineQueMemeLoicPeutBattre, si on n'a pas fait de downcast, il suffit de créer cette classe, et de changer le bout de code qui crée l'objet, c'est tout (même ce dernier point peut être réduit par l'intermédiaire de factories), c'est tout. Si on a fait du downcast, on doit parcourir l'ensemble du code à la recherche de ces downcasts pour ajouter la nouvelle classe partout.
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