Heritage: virtual / static probleme de design - C++ - Programmation
Marsh Posté le 14-04-2008 à 14:44:58
pas de virtual static ça n'a pas de sens.
Code :
|
Me parait quand même plus simple et plus sensée.
Marsh Posté le 15-04-2008 à 10:42:00
ReplyMarsh Posté le 15-04-2008 à 11:08:31
si tu veux faire une RTTI fait le proprement - il y a plein de source sur le net qui explique comment faire.
Marsh Posté le 15-04-2008 à 14:57:51
ReplyMarsh Posté le 16-04-2008 à 03:14:27
Bon, bon c'est pas encore gagné ... Je cherche une solution la plus facilement maintenable et portable.
Je ne connaissais pas le RTTI, d'après ce que j'ai lu, c'est pas non plus adapté à mon cas. Si je souhaite ajouter une nouvelle classe dérivée de ma classe de référence, je dois modifié toutes les fonctions essayant de "dynamic_cast" mes classes dérivées. De meme que dynamic_cast s'applique à un pointeur ou une référence.
La seule solution semble etre les templates ... Je suis en train de trouver comment organiser ça simplement, pour l'instant c'est pas gagné ... Erreur durant le link :
multiple definition of `char* getClassName<A>()' |
Il n'a pas l'air d'aimer la specialisation dans un autre fichier ...
Pour l'instant, j'avais ça :
Object.hpp
class Object { |
ObjectA.hpp
|
Il semblerait que je doive réorganiser en ...
Object.hpp
class Object { |
ObjectA.hpp
|
ObjectName.tpp
template<class T> char* getClassName() { return NULL; } |
Marsh Posté le 16-04-2008 à 03:43:27
Olivier51 a écrit :
|
Le mot magique est inline :
Object.hpp
class Object { |
ObjectA.hpp
|
Marsh Posté le 16-04-2008 à 13:57:03
éventuellement, tu peux retourner un const char *, et implémenter les spécialisations dans une UT unique, pour pouvoir comparer par simple ==. Sinon y aura forcément des linker quiche pour faire 36 définitions de "A".
Marsh Posté le 17-04-2008 à 11:44:00
Olivier51 a écrit : Bon, bon c'est pas encore gagné ... Je cherche une solution la plus facilement maintenable et portable. |
euh la j'ai pas tout compris
Marsh Posté le 23-04-2008 à 16:28:17
au risque d'être hs ...
typeid().name, c'est pas ça que tu voudrais ?
http://www.cplusplus.com/doc/tutorial/typecasting.html
Marsh Posté le 23-04-2008 à 17:08:28
non, car c'est pas plateforme independant et ca renvoit pas d'objet de premier ordre, rendant la comparaison de typeid moche.
Marsh Posté le 14-04-2008 à 13:39:13
Voila j'aimerai pouvoir acceder a des infos sur mes classes derivees de maniere static et dynamique, bon c'est pas tres clair un petit exemple :
Structure :
Acces :
J'aimerai pouvoir recuperer le nom de la classe par Object::getClassName() ou par a->getClassName() (avec a instance de A).
L'idee serait de faire ca le plus proprement possible. Il y a la solution du template :
template<class T> char* getClassName();
template<A> char* getClassName() { return "A"; }
template<B> char* getClassName() { return "B"; }
Comme il y aura beaucoup de classes heritees d'Object et que ces classes pourraient arriver plus tard, j'aimerais quelque chose de simple pour eviter d'oublier quelque chose. Bien sur la solution qui serait bien ce serait :
... Mais ca ne semble pas etre possible.