wizzo
Messages postés35Date d'inscriptionjeudi 12 septembre 2002StatutMembreDernière intervention25 octobre 2006
-
12 juil. 2006 à 17:26
wizzo
Messages postés35Date d'inscriptionjeudi 12 septembre 2002StatutMembreDernière intervention25 octobre 2006
-
13 juil. 2006 à 11:57
Salut a tous.
Je relance la discussion eternelle sur l'usage des macro.
En theorie, elles sont à proscrire car n'ayant aucune idée des scopes/portées des namespace, classes et autres, et ne sont pas typesafe.
Ce qui elimine leur usage pour les constantes, fonctions, etc (remplacé par les const float var = , les fonctions inline et template)
Je suis parfaitement d'accord avec ça.
Mais de temps en temps je vois sur un site qqun qui dit ne jamais utiliser de macro, alors qu'il m'arrive de rencontrer des cas ou je me sens obligé d'en utiliser.
Voila un exemple :
J'ai implementé un système de RTTI. Je veux que pour chaque classe que je déclare avoir un membre static s_kType. MAIS voyons le code suivant :
class cBaseRTTI {
static cRTTI s_kType;
cRTTI GetRTTI();
/*...*/
};
class cDerivee : public cBaseRTTI {
/*...*/
};
Mon membre static est LE MEME pour toutes les classes dérivées !
cad que dans l'ordre:
1 - je créer cBaseRTTI
2 - cBaseRTTI var;
var.GetRTTI() va me dire que ma variable est de type cBaseRTTI
3 - je créer cDerivee
cDerivee var2;
var2.GetRTTI() va me dire que ma variable est de type cDerivee, ce qui est OK
MAIS
cBaseRTTI var;
var.GetRTTI() va me dire que ma variable est de type cDerivee !
Donc j'ai trouvé une solution, en ajoutant le code relatif au RTTI dans une macro, et en faisant un DECLARE_RTTI(cDerivee) et IMPLEMENT_RTTI(cDerivee), qui marche tres bien et qui me statisfait dans l'ensemble, mais j'aimerai bien savoir COMMENT on pourrai faire sans macro.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 12 juil. 2006 à 20:25
Le fait que le C++ offre des supports permettant de se passer de macros
la ou on avait l'habitude de les utiliser en C ne veut pas dire que
leurs utilisation est à bannir, une macro reste une macro. C'est juste
qu'on sera moins souvent ammener a en utilisé.
Par contre pour ton histoire de RTTI fait maison j'ai pas trop compris
comment tu l'implementais, tu peux donner plus de détail ?
wizzo
Messages postés35Date d'inscriptionjeudi 12 septembre 2002StatutMembreDernière intervention25 octobre 2006 13 juil. 2006 à 11:57
"Mon membre static est LE MEME pour toutes les classes dérivées !"
Après quelques tests, je me suis aperçu que mon postulat etait erroné
en faisant MyClass::s_kType j'avais toujours accès au membre de la classe mère, mais il suffisait d'inserer un getter surchargé dans le process pour etre sur de recuperer le s_kType de la classe courante.
Au final, la macro ke j'utilise ne sert qu'à simplifier l'ecriture du code.