Bonjour,
Considérez les classes suivantes :
class Updatable
{
protected:
virtual void update() = 0;
};
class Widget : public virtual sf::Drawable, public virtual sf::Transformable, public virtual Updatable
{};
template <typename T>
class Drawer : public Widget, public T
{
private:
virtual void update() { /* rien a mettre a jour */ }
};
La classe Drawer permet de transformer un Drawable existant en Widget. Cela peut servir si on veut regrouper des objets dans un conteneur de Widgets.
Cependant, ce code ne compile pas :
Drawer<sf::Sprite> sprite;
En effet, la methode draw de Widget n'est pas définie, et Sprite n'hérite pas de Drawable virtuellement.
En revanche, avec cette classe, ça marche:
class MySprite : public virtual sf::Drawable, public virtual sf::Transformable
{
private:
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
{
/* dessin */
}
};
C'est grâce à l'héritage virtuel.
Ma requête est donc la suivante:
Je voudrais que toutes les classes de la SFML qui héritent de Drawable et/ou Transformable le fasse virtuellement.
J'attends vos commentaires.
Cordialement.
Le but est des transformer un Drawable existant en Widget tout en gardant l'interface de base.
Drawer<sf::Sprite> sprite;
sprite.setTexture(texture);
sprite.move(x, y);
L’intérêt d'en faire un Widget est de pouvoir l'ajouter à un conteneur de pointeurs sur Widget.
Group<Widget> gui;
gui.push_back(&sprite);
/*...*/
gui.draw(target) // dessine le sprite et les autres widgets
/*...*/
gui.update(); // update des widgets, ne fait rien au sprite
Je suis amené à faire ça dans mon projet de bibliothèque de GUI (voir ce sujet (http://fr.sfml-dev.org/forums/index.php?topic=8215.0)). Je suis en train de faire de gros changements avec des classes templates pour me permettre de faire une classe RadioGroup qui dériverait de Layout<CheckBox>.