Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1644 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Heritage: virtual / static probleme de design

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Heritage: virtual / static probleme de design

n°1717224
Olivier51
Posté le 14-04-2008 à 13:39:13  profilanswer
 

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.

mood
Publicité
Posté le 14-04-2008 à 13:39:13  profilanswer
 

n°1717228
Taz
bisounours-codeur
Posté le 14-04-2008 à 13:43:22  profilanswer
 

bah de static virtual.

n°1717262
Joel F
Real men use unique_ptr
Posté le 14-04-2008 à 14:44:58  profilanswer
 

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.

n°1717604
Taz
bisounours-codeur
Posté le 15-04-2008 à 10:42:00  profilanswer
 

et ta prose elle arrive ?

Message cité 1 fois
Message édité par Taz le 15-04-2008 à 10:42:12
n°1717644
papangue
Posté le 15-04-2008 à 11:08:31  profilanswer
 

si tu veux faire une RTTI fait le proprement - il y a plein de source sur le net qui explique comment faire.

n°1717853
Joel F
Real men use unique_ptr
Posté le 15-04-2008 à 14:57:51  profilanswer
 

Taz a écrit :

et ta prose elle arrive ?


 
Oui faut que je m'y remettes v_v

n°1718192
Olivier51
Posté le 16-04-2008 à 03:14:27  profilanswer
 

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"; }

n°1718194
Olivier51
Posté le 16-04-2008 à 03:43:27  profilanswer
 

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"; }

n°1718567
Taz
bisounours-codeur
Posté le 16-04-2008 à 13:57:03  profilanswer
 

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

n°1719056
papangue
Posté le 17-04-2008 à 11:44:00  profilanswer
 

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  :??:

mood
Publicité
Posté le 17-04-2008 à 11:44:00  profilanswer
 

n°1722960
in_your_ph​ion
Posté le 23-04-2008 à 16:28:17  profilanswer
 

au risque d'être hs ...
 
 
typeid().name,  c'est pas ça que tu voudrais ?
http://www.cplusplus.com/doc/tutorial/typecasting.html

n°1723010
Joel F
Real men use unique_ptr
Posté le 23-04-2008 à 17:08:28  profilanswer
 

non, car c'est pas plateforme independant et ca renvoit pas d'objet de premier ordre, rendant la comparaison de typeid moche.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Heritage: virtual / static probleme de design

 

Sujets relatifs
Probleme d'apostrophe en javascript[sql] probleme pour creer des tables avec foreign key
Question de design : WebServices et rétrocompatibilitéProbleme requete VBA
probléme de variableProblème : Installation/Migration site joomla sur serveur ovh
Pixelpost, problème d'accents après upgrade vers 1.7.1[DOM] : Probleme appendChild
[Batch] Problème de variable dans boucle for[PHP] pbm fonction "public static"
Plus de sujets relatifs à : Heritage: virtual / static probleme de design


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR