Heritage: virtual / static probleme de design

Heritage: virtual / static probleme de design - C++ - Programmation

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 :

Code :
  1. class Object {
  2. };
  3. class A : public Object {
  4. public:
  5. static const char* getClassName() { return "A"; };
  6. };
  7. class B : public Object {
  8. public:
  9. static const char* getClassName() { return "B"; };
  10. };


 
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 :

Code :
  1. class Object {
  2. public:
  3. virtual static const char* getClassName() = 0;
  4. };


... Mais ca ne semble pas etre possible.

Reply

Marsh Posté le 14-04-2008 à 13:39:13   

Reply

Marsh Posté le 14-04-2008 à 13:43:22    

bah de static virtual.

Reply

Marsh Posté le 14-04-2008 à 14:44:58    

pas de virtual static ça n'a pas de sens.
 

Code :
  1. template<class T> char* getClassName();
  2. template<A> char* getClassName() { return "A"; }
  3. template<B> char* getClassName() { return "B"; }


 
Me parait quand même plus simple et plus sensée.

Reply

Marsh Posté le 15-04-2008 à 10:42:00    

et ta prose elle arrive ?

Message cité 1 fois
Message édité par Taz le 15-04-2008 à 10:42:12
Reply

Marsh 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.

Reply

Marsh Posté le 15-04-2008 à 14:57:51    

Taz a écrit :

et ta prose elle arrive ?


 
Oui faut que je m'y remettes v_v

Reply

Marsh 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 {
 
};
template<class T> char* getClassName() { return NULL; }


 
ObjectA.hpp


#include "Object.hpp"
 
class A : public Object {
 
};
template<> char* getClassName<A>() { return "A"; }


 
Il semblerait que je doive réorganiser en ...
Object.hpp

class Object {
 
};


 
ObjectA.hpp


#include "Object.hpp"
 
class A : public Object {
 
};


 
ObjectName.tpp

template<class T> char* getClassName() { return NULL; }
 
class A;
template<> char* getClassName<A>() { return "A"; }

Reply

Marsh Posté le 16-04-2008 à 03:43:27    

Olivier51 a écrit :


Object.hpp

class Object {
 
};
template<class T> char* getClassName() { return NULL; }


 
ObjectA.hpp


#include "Object.hpp"
 
class A : public Object {
 
};
template<> char* getClassName<A>() { return "A"; }




Le mot magique est inline :
Object.hpp

class Object {
 
};
template<class T> char* getClassName() { return NULL; }


 
ObjectA.hpp


#include "Object.hpp"
 
class A : public Object {
 
};
template<> inline char* getClassName<A>() { return "A"; }

Reply

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".

Reply

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.
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.


euh la j'ai pas tout compris  :??:

Reply

Marsh Posté le 17-04-2008 à 11:44:00   

Reply

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

Reply

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed