Bonjour,
j'ai un problème avec l'opérateur typeid qui sert pour connaitre la classe
d'un objet à l'éxécution...
En gros, j'ai une classe Object, avec une méthode getClassName() qui
renvoie typeid(this).name().
Si je teste par exemple Object* obj = new Object(); obj->getClassName();
c'est bon, ça me renvoie une chaine du genre "PObject", bref il a bien
trouvé la classe.
Mais si j'essaye avec des sous-classes de Object, alors getClassName() me
renvoie toujours cette même chaine "PObject"...
Par exemple avec Cell qui dérive de Object: Cell* cell = new Cell();
cell->getClassName(); devrait me renvoyer une chaine qui contient "Cell",
ben non, il me renvoie "PObject"... Je précise que la méthode
getClassName() n'est pas redéfinie dans mes sous classes, c'est donc la
méthode de Object qui est appelée à chaque fois. Je ne comprends pas d'où
vient le problème, quelqu'un a t'il une idée ??
Merci d'avance!
--
0% de pub! Que du bonheur et des vrais adhérents !
Vous aussi inscrivez-vous sans plus tarder!!
Message posté à partir de http://www.gyptis.org, BBS actif depuis 1995.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Benoit Rousseau
Palmic wrote:
[...] Mais si j'essaye avec des sous-classes de Object, alors getClassName() me renvoie toujours cette même chaine "PObject"... Par exemple avec Cell qui dérive de Object: Cell* cell = new Cell(); cell->getClassName(); devrait me renvoyer une chaine qui contient "Cell", ben non, il me renvoie "PObject"... Je précise que la méthode getClassName() n'est pas redéfinie dans mes sous classes, c'est donc la méthode de Object qui est appelée à chaque fois. Je ne comprends pas d'où vient le problème, quelqu'un a t'il une idée ??
Les RTTI ont été conçus pour n'être utilisé qu'avec des objets polymorphes. S'il n'y a pas de polymorphisme, c'est l'information statique concernant le type qui est utilisée.
Le problème disparrait si tu ajoutes une fonction virtuelle à ta classe de base (tu en auras surement besoin une fois que tu auras fini de 'jouer' avec typeid() :-) )
-- -------------------------------------------- Benoît Rousseau : roussebe at spray dot se Jouez en programmant : http://realtimebattle.sourceforge.net/
Palmic wrote:
[...]
Mais si j'essaye avec des sous-classes de Object, alors getClassName() me
renvoie toujours cette même chaine "PObject"...
Par exemple avec Cell qui dérive de Object: Cell* cell = new Cell();
cell->getClassName(); devrait me renvoyer une chaine qui contient "Cell",
ben non, il me renvoie "PObject"... Je précise que la méthode
getClassName() n'est pas redéfinie dans mes sous classes, c'est donc la
méthode de Object qui est appelée à chaque fois. Je ne comprends pas d'où
vient le problème, quelqu'un a t'il une idée ??
Les RTTI ont été conçus pour n'être utilisé qu'avec des objets
polymorphes. S'il n'y a pas de polymorphisme, c'est l'information
statique concernant le type qui est utilisée.
Le problème disparrait si tu ajoutes une fonction virtuelle à ta classe
de base (tu en auras surement besoin une fois que tu auras fini de
'jouer' avec typeid() :-) )
--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/
[...] Mais si j'essaye avec des sous-classes de Object, alors getClassName() me renvoie toujours cette même chaine "PObject"... Par exemple avec Cell qui dérive de Object: Cell* cell = new Cell(); cell->getClassName(); devrait me renvoyer une chaine qui contient "Cell", ben non, il me renvoie "PObject"... Je précise que la méthode getClassName() n'est pas redéfinie dans mes sous classes, c'est donc la méthode de Object qui est appelée à chaque fois. Je ne comprends pas d'où vient le problème, quelqu'un a t'il une idée ??
Les RTTI ont été conçus pour n'être utilisé qu'avec des objets polymorphes. S'il n'y a pas de polymorphisme, c'est l'information statique concernant le type qui est utilisée.
Le problème disparrait si tu ajoutes une fonction virtuelle à ta classe de base (tu en auras surement besoin une fois que tu auras fini de 'jouer' avec typeid() :-) )
-- -------------------------------------------- Benoît Rousseau : roussebe at spray dot se Jouez en programmant : http://realtimebattle.sourceforge.net/
kanze
(Palmic) wrote in message news:<bmgc0r$lpr$...
j'ai un problème avec l'opérateur typeid qui sert pour connaitre la classe d'un objet à l'éxécution...
En gros, j'ai une classe Object, avec une méthode getClassName() qui renvoie typeid(this).name().
Donc, toujours « pointeur à Object ». C'est bien le type de this dans une fonction membre d'Object.
Autant que faire, tu aurais pu renvoyer "PObject". Je ne vois pas l'intérêt à faire typeid sur un type que tu connais. En dehors d'un template, je ne vois l'intérêt de typeid que sur des expressions polymorphiques. Or, un pointeur n'est jamais polymorphique.
Si je teste par exemple Object* obj = new Object(); obj->getClassName(); c'est bon, ça me renvoie une chaine du genre "PObject", bref il a bien trouvé la classe.
Je conclus que ton implémentation préfixe un P majuscule au nom de la classe pour dire que c'est un pointeur. On pourrait faire mieux -- que de confusion si tu as aussi une classe P.
Mais si j'essaye avec des sous-classes de Object, alors getClassName() me renvoie toujours cette même chaine "PObject"...
Tu l'as rédéfinie dans la classe dérivée, j'espère.
Par exemple avec Cell qui dérive de Object: Cell* cell = new Cell(); cell->getClassName(); devrait me renvoyer une chaine qui contient "Cell", ben non, il me renvoie "PObject"... Je précise que la méthode getClassName() n'est pas redéfinie dans mes sous classes, c'est donc la méthode de Object qui est appelée à chaque fois.
Et dans une fonction de Object, this a toujours le type « pointeur à Object ».
Sans doute ce que tu veux, c'est « typeid( *this ) ». Un pointeur n'est pas polymorphique, mais ce qu'il désigne peut bien l'être (à conditon d'avoir au moins une fonction virtuelle).
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
palmic@free.fr (Palmic) wrote in message
news:<bmgc0r$lpr$1@gyptis.org>...
j'ai un problème avec l'opérateur typeid qui sert pour connaitre la
classe d'un objet à l'éxécution...
En gros, j'ai une classe Object, avec une méthode getClassName() qui
renvoie typeid(this).name().
Donc, toujours « pointeur à Object ». C'est bien le type de this dans
une fonction membre d'Object.
Autant que faire, tu aurais pu renvoyer "PObject". Je ne vois pas
l'intérêt à faire typeid sur un type que tu connais. En dehors d'un
template, je ne vois l'intérêt de typeid que sur des expressions
polymorphiques. Or, un pointeur n'est jamais polymorphique.
Si je teste par exemple Object* obj = new Object();
obj->getClassName(); c'est bon, ça me renvoie une chaine du genre
"PObject", bref il a bien trouvé la classe.
Je conclus que ton implémentation préfixe un P majuscule au nom de la
classe pour dire que c'est un pointeur. On pourrait faire mieux -- que
de confusion si tu as aussi une classe P.
Mais si j'essaye avec des sous-classes de Object, alors getClassName()
me renvoie toujours cette même chaine "PObject"...
Tu l'as rédéfinie dans la classe dérivée, j'espère.
Par exemple avec Cell qui dérive de Object: Cell* cell = new Cell();
cell->getClassName(); devrait me renvoyer une chaine qui contient
"Cell", ben non, il me renvoie "PObject"... Je précise que la méthode
getClassName() n'est pas redéfinie dans mes sous classes, c'est donc
la méthode de Object qui est appelée à chaque fois.
Et dans une fonction de Object, this a toujours le type « pointeur à
Object ».
Sans doute ce que tu veux, c'est « typeid( *this ) ». Un pointeur n'est
pas polymorphique, mais ce qu'il désigne peut bien l'être (à conditon
d'avoir au moins une fonction virtuelle).
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
j'ai un problème avec l'opérateur typeid qui sert pour connaitre la classe d'un objet à l'éxécution...
En gros, j'ai une classe Object, avec une méthode getClassName() qui renvoie typeid(this).name().
Donc, toujours « pointeur à Object ». C'est bien le type de this dans une fonction membre d'Object.
Autant que faire, tu aurais pu renvoyer "PObject". Je ne vois pas l'intérêt à faire typeid sur un type que tu connais. En dehors d'un template, je ne vois l'intérêt de typeid que sur des expressions polymorphiques. Or, un pointeur n'est jamais polymorphique.
Si je teste par exemple Object* obj = new Object(); obj->getClassName(); c'est bon, ça me renvoie une chaine du genre "PObject", bref il a bien trouvé la classe.
Je conclus que ton implémentation préfixe un P majuscule au nom de la classe pour dire que c'est un pointeur. On pourrait faire mieux -- que de confusion si tu as aussi une classe P.
Mais si j'essaye avec des sous-classes de Object, alors getClassName() me renvoie toujours cette même chaine "PObject"...
Tu l'as rédéfinie dans la classe dérivée, j'espère.
Par exemple avec Cell qui dérive de Object: Cell* cell = new Cell(); cell->getClassName(); devrait me renvoyer une chaine qui contient "Cell", ben non, il me renvoie "PObject"... Je précise que la méthode getClassName() n'est pas redéfinie dans mes sous classes, c'est donc la méthode de Object qui est appelée à chaque fois.
Et dans une fonction de Object, this a toujours le type « pointeur à Object ».
Sans doute ce que tu veux, c'est « typeid( *this ) ». Un pointeur n'est pas polymorphique, mais ce qu'il désigne peut bien l'être (à conditon d'avoir au moins une fonction virtuelle).
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16