|Edit:
|Le titre du post pourrait plutôt être "Quand utiliser le Singleton ?" à
|partir du post #5.
Bonjour à tous ;-)
Voici mon problème: j'ai une variable _vDrawer qui a comme type un pointeur vers une classe abstraite VDrawer. _vDrawer peut alors pointer soit vers VDrawer2d, soit vers VDrawer3d.
VDrawer2d et VDrawer3d héritent aussi d'une classe Singletonqui contient une méthode statique kill(), à laquelle j'aimerais pouvoir accéder à partir de _vDrawer.
Voici mon code actuel:
getVideoDrawer() retourne évidement _vDrawer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part VEngine::getInstance()->getVideoDrawer()::kill();
Evidement, le ::kill() ne fonctionne pas comme il devrait ;-)
Il faut aussi ajouter que le VDrawer n'hérite pas de Singleton, tandis que VDrawer2d et VDrawer3d le font. C'est peut-être la cause du problème.
Merci d'avance !
Edit: J'ai essayé ceci aussi, mais il semblerait que typeid ne serve qu'à comparer 2 classes différentes.
Edit2: On pourrait aussi faire hériter VDrawer de Singleton pour ne pas avoir d'héritage multiple, mais, vous vous en doutez, VDrawer est un Builder et le faire hériter de la classe Singleton l'obligerait à devenir une classe template pour permettre aux classes VDrawer2d et VDrawer3d de devenir des singletons aussi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part typeid(*(VEngine::getInstance()->getVideoDrawer()))::kill();
Jusque là, c'est faisable sans trop de problèmes, mais ça détruit tout l'intéret du builder puisque je serais obligé de déclaré _vDrawer comme ceci:
Edit3: Solution temporaire trouvée: créer une méthode non-static kill dans VDrawer. Elle serait définie de cette manière dans VDrawer2d par exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part VDrawer<VDrawer2d> *_vDrawer;
Malgré ça, je n'aime pas avoir ce genre de bidouille dans mon code s'il y a moyen de l'éviter. J'ai cependant bien peur que ce ne soit possible dans mon cas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 void VDrawer2D::kill() { VDrawer2D::kill(); }
Partager