2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est alors
obligé de se "souvenir" que les portions du code qui utilisent RTTI
dépendent de cette hiérarchie
2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est alors
obligé de se "souvenir" que les portions du code qui utilisent RTTI
dépendent de cette hiérarchie
2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est alors
obligé de se "souvenir" que les portions du code qui utilisent RTTI
dépendent de cette hiérarchie
Bonjour,
Quel est l'avantage de typeid( Object ) face à une fonction
Objet::type() retournant un entier par fixe pour chaque type d'Objet à
leur construction ?
Est ce que ca n'engendre pas trop de calculs ?
Est ce que les RTTI sont bien supportés par gcc 3.2.x ?
Bonjour,
Quel est l'avantage de typeid( Object ) face à une fonction
Objet::type() retournant un entier par fixe pour chaque type d'Objet à
leur construction ?
Est ce que ca n'engendre pas trop de calculs ?
Est ce que les RTTI sont bien supportés par gcc 3.2.x ?
Bonjour,
Quel est l'avantage de typeid( Object ) face à une fonction
Objet::type() retournant un entier par fixe pour chaque type d'Objet à
leur construction ?
Est ce que ca n'engendre pas trop de calculs ?
Est ce que les RTTI sont bien supportés par gcc 3.2.x ?
if (typeid(a)==typeid(b) || typeid(a)!=typeid(c))
Cela dit, à mon humble avis, un code C++ qui utilise le RTTI est un
programme mal foutu pour plusieurs raisons:
1) on peut toujours faire la même chose avec des méthodes virtuelles,
qui ne cassent pas le pipeline comme les tests
if (typeid(a)==typeid(b) || typeid(a)!=typeid(c))
Cela dit, à mon humble avis, un code C++ qui utilise le RTTI est un
programme mal foutu pour plusieurs raisons:
1) on peut toujours faire la même chose avec des méthodes virtuelles,
qui ne cassent pas le pipeline comme les tests
if (typeid(a)==typeid(b) || typeid(a)!=typeid(c))
Cela dit, à mon humble avis, un code C++ qui utilise le RTTI est un
programme mal foutu pour plusieurs raisons:
1) on peut toujours faire la même chose avec des méthodes virtuelles,
qui ne cassent pas le pipeline comme les tests
l'avantage c'est que tu n'as pas besoin d'écrire une fonction par
classe (elle devrait être virtuelle pour fonctionner comme typeid) ,
puisque typeid le fait exactement de cette manière.
Ca n'engendre pas plus de "calcul" qu'une méthode virtuelle normale et
ça ajoute donc grosso-modo un pointeur de plus à chaque objet.
Comme ça n'est pas très compliqué, tous les compilateurs le font
facilement, mais attention!
Le standard ne dit rien du type réel du retour!
Chaque compilateur peut implanter type_info comme il veut, certains ne
promettent même pas de renvoyer le même résultat après chaque
compilation (ils risquent de renuméroter les classes différemment
chaque fois que tu en ajoute/enlève une)
donc le seul moyen d'utiliser RTTI de manière portable est
if (typeid(a)==typeid(b) || typeid(a)!=typeid(c))
Cela dit, à mon humble avis, un code C++ qui utilise le RTTI est un
programme mal foutu pour plusieurs raisons:
1) on peut toujours faire la même chose avec des méthodes virtuelles,
qui ne cassent pas le pipeline comme les tests
2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est alors
obligé de se "souvenir" que les portions du code qui utilisent RTTI
dépendent de cette hiérarchie
l'avantage c'est que tu n'as pas besoin d'écrire une fonction par
classe (elle devrait être virtuelle pour fonctionner comme typeid) ,
puisque typeid le fait exactement de cette manière.
Ca n'engendre pas plus de "calcul" qu'une méthode virtuelle normale et
ça ajoute donc grosso-modo un pointeur de plus à chaque objet.
Comme ça n'est pas très compliqué, tous les compilateurs le font
facilement, mais attention!
Le standard ne dit rien du type réel du retour!
Chaque compilateur peut implanter type_info comme il veut, certains ne
promettent même pas de renvoyer le même résultat après chaque
compilation (ils risquent de renuméroter les classes différemment
chaque fois que tu en ajoute/enlève une)
donc le seul moyen d'utiliser RTTI de manière portable est
if (typeid(a)==typeid(b) || typeid(a)!=typeid(c))
Cela dit, à mon humble avis, un code C++ qui utilise le RTTI est un
programme mal foutu pour plusieurs raisons:
1) on peut toujours faire la même chose avec des méthodes virtuelles,
qui ne cassent pas le pipeline comme les tests
2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est alors
obligé de se "souvenir" que les portions du code qui utilisent RTTI
dépendent de cette hiérarchie
l'avantage c'est que tu n'as pas besoin d'écrire une fonction par
classe (elle devrait être virtuelle pour fonctionner comme typeid) ,
puisque typeid le fait exactement de cette manière.
Ca n'engendre pas plus de "calcul" qu'une méthode virtuelle normale et
ça ajoute donc grosso-modo un pointeur de plus à chaque objet.
Comme ça n'est pas très compliqué, tous les compilateurs le font
facilement, mais attention!
Le standard ne dit rien du type réel du retour!
Chaque compilateur peut implanter type_info comme il veut, certains ne
promettent même pas de renvoyer le même résultat après chaque
compilation (ils risquent de renuméroter les classes différemment
chaque fois que tu en ajoute/enlève une)
donc le seul moyen d'utiliser RTTI de manière portable est
if (typeid(a)==typeid(b) || typeid(a)!=typeid(c))
Cela dit, à mon humble avis, un code C++ qui utilise le RTTI est un
programme mal foutu pour plusieurs raisons:
1) on peut toujours faire la même chose avec des méthodes virtuelles,
qui ne cassent pas le pipeline comme les tests
2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est alors
obligé de se "souvenir" que les portions du code qui utilisent RTTI
dépendent de cette hiérarchie
2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est alors
obligé de se "souvenir" que les portions du code qui utilisent RTTI
dépendent de cette hiérarchie
Ça dépend comment on l'utilise. C'est sûr que du code genre :
if ( typeid( *p ) == typeid( ClasseA ) ) {
} else if ( typeid( *p ) == typeid( ClasseB ) {
...
est à éviter.
Enfin, il y a la fonction name, dont le résultat est défini par
l'implémentation. Ce qui limite son utilité à des routines de trace et
d'autres sorties d'instrumentation, qui ne seront lues que par des êtres
humains. (À l'exception de g++, la plupart des compilateurs donne une
chaîne lisible).
2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est alors
obligé de se "souvenir" que les portions du code qui utilisent RTTI
dépendent de cette hiérarchie
Ça dépend comment on l'utilise. C'est sûr que du code genre :
if ( typeid( *p ) == typeid( ClasseA ) ) {
} else if ( typeid( *p ) == typeid( ClasseB ) {
...
est à éviter.
Enfin, il y a la fonction name, dont le résultat est défini par
l'implémentation. Ce qui limite son utilité à des routines de trace et
d'autres sorties d'instrumentation, qui ne seront lues que par des êtres
humains. (À l'exception de g++, la plupart des compilateurs donne une
chaîne lisible).
2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est alors
obligé de se "souvenir" que les portions du code qui utilisent RTTI
dépendent de cette hiérarchie
Ça dépend comment on l'utilise. C'est sûr que du code genre :
if ( typeid( *p ) == typeid( ClasseA ) ) {
} else if ( typeid( *p ) == typeid( ClasseB ) {
...
est à éviter.
Enfin, il y a la fonction name, dont le résultat est défini par
l'implémentation. Ce qui limite son utilité à des routines de trace et
d'autres sorties d'instrumentation, qui ne seront lues que par des êtres
humains. (À l'exception de g++, la plupart des compilateurs donne une
chaîne lisible).
wrote:2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est alors
obligé de se "souvenir" que les portions du code qui utilisent RTTI
dépendent de cette hiérarchie
Ça dépend comment on l'utilise. C'est sûr que du code genre :
if ( typeid( *p ) == typeid( ClasseA ) ) {
} else if ( typeid( *p ) == typeid( ClasseB ) {
...
est à éviter.
Pourquoi est ce à éviter ?
J'ai une classe Observer que l'on appelle par la fonction notify(Event*)
Il faut que je fasse ce genre de test pour déterminer ce que je vais faire
de mon Event*.
Sinon, il faudrait que je spécialise chacun des événements pour chacun des
Observers (une Factory pour chaque Observer ?) et ce serait beaucoup de
travail en plus...
kanze@gabi-soft.fr wrote:
2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est alors
obligé de se "souvenir" que les portions du code qui utilisent RTTI
dépendent de cette hiérarchie
Ça dépend comment on l'utilise. C'est sûr que du code genre :
if ( typeid( *p ) == typeid( ClasseA ) ) {
} else if ( typeid( *p ) == typeid( ClasseB ) {
...
est à éviter.
Pourquoi est ce à éviter ?
J'ai une classe Observer que l'on appelle par la fonction notify(Event*)
Il faut que je fasse ce genre de test pour déterminer ce que je vais faire
de mon Event*.
Sinon, il faudrait que je spécialise chacun des événements pour chacun des
Observers (une Factory pour chaque Observer ?) et ce serait beaucoup de
travail en plus...
wrote:2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est alors
obligé de se "souvenir" que les portions du code qui utilisent RTTI
dépendent de cette hiérarchie
Ça dépend comment on l'utilise. C'est sûr que du code genre :
if ( typeid( *p ) == typeid( ClasseA ) ) {
} else if ( typeid( *p ) == typeid( ClasseB ) {
...
est à éviter.
Pourquoi est ce à éviter ?
J'ai une classe Observer que l'on appelle par la fonction notify(Event*)
Il faut que je fasse ce genre de test pour déterminer ce que je vais faire
de mon Event*.
Sinon, il faudrait que je spécialise chacun des événements pour chacun des
Observers (une Factory pour chaque Observer ?) et ce serait beaucoup de
travail en plus...
wrote:2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est
alors obligé de se "souvenir" que les portions du code qui utilisent
RTTI dépendent de cette hiérarchie
Ça dépend comment on l'utilise. C'est sûr que du code genre :
if ( typeid( *p ) == typeid( ClasseA ) ) {
} else if ( typeid( *p ) == typeid( ClasseB ) {
...
est à éviter.
Pourquoi est ce à éviter ?
J'ai une classe Observer que l'on appelle par la fonction
notify(Event*) Il faut que je fasse ce genre de test pour déterminer
ce que je vais faire de mon Event*.
Sinon, il faudrait que je spécialise chacun des événements pour chacun
des Observers (une Factory pour chaque Observer ?) et ce serait
beaucoup de travail en plus...
Enfin, il y a la fonction name, dont le résultat est défini par
l'implémentation. Ce qui limite son utilité à des routines de trace
et d'autres sorties d'instrumentation, qui ne seront lues que par
des êtres humains. (À l'exception de g++, la plupart des
compilateurs donne une chaîne lisible).
Jusqu'à présent, il me retourne une chaine composé de la longueur du
nom de la classe suivit du nom de la classe : 5Event, 8Observer, ...
kanze@gabi-soft.fr wrote:
2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est
alors obligé de se "souvenir" que les portions du code qui utilisent
RTTI dépendent de cette hiérarchie
Ça dépend comment on l'utilise. C'est sûr que du code genre :
if ( typeid( *p ) == typeid( ClasseA ) ) {
} else if ( typeid( *p ) == typeid( ClasseB ) {
...
est à éviter.
Pourquoi est ce à éviter ?
J'ai une classe Observer que l'on appelle par la fonction
notify(Event*) Il faut que je fasse ce genre de test pour déterminer
ce que je vais faire de mon Event*.
Sinon, il faudrait que je spécialise chacun des événements pour chacun
des Observers (une Factory pour chaque Observer ?) et ce serait
beaucoup de travail en plus...
Enfin, il y a la fonction name, dont le résultat est défini par
l'implémentation. Ce qui limite son utilité à des routines de trace
et d'autres sorties d'instrumentation, qui ne seront lues que par
des êtres humains. (À l'exception de g++, la plupart des
compilateurs donne une chaîne lisible).
Jusqu'à présent, il me retourne une chaine composé de la longueur du
nom de la classe suivit du nom de la classe : 5Event, 8Observer, ...
wrote:2) on augmente le risque d'erreur à l'exécution, surtout si en
maintenant le code on change la hiérarchie des classes : on est
alors obligé de se "souvenir" que les portions du code qui utilisent
RTTI dépendent de cette hiérarchie
Ça dépend comment on l'utilise. C'est sûr que du code genre :
if ( typeid( *p ) == typeid( ClasseA ) ) {
} else if ( typeid( *p ) == typeid( ClasseB ) {
...
est à éviter.
Pourquoi est ce à éviter ?
J'ai une classe Observer que l'on appelle par la fonction
notify(Event*) Il faut que je fasse ce genre de test pour déterminer
ce que je vais faire de mon Event*.
Sinon, il faudrait que je spécialise chacun des événements pour chacun
des Observers (une Factory pour chaque Observer ?) et ce serait
beaucoup de travail en plus...
Enfin, il y a la fonction name, dont le résultat est défini par
l'implémentation. Ce qui limite son utilité à des routines de trace
et d'autres sorties d'instrumentation, qui ne seront lues que par
des êtres humains. (À l'exception de g++, la plupart des
compilateurs donne une chaîne lisible).
Jusqu'à présent, il me retourne une chaine composé de la longueur du
nom de la classe suivit du nom de la classe : 5Event, 8Observer, ...