Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Héritage virtuel de Drawable et Transformable  (Lu 4149 fois)

0 Membres et 1 Invité sur ce sujet

kimci86

  • Full Member
  • ***
  • Messages: 128
    • Voir le profil
Héritage virtuel de Drawable et Transformable
« le: Juillet 14, 2012, 04:08:37 pm »
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.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Héritage virtuel de Drawable et Transformable
« Réponse #1 le: Juillet 14, 2012, 05:43:27 pm »
T'es sûr que tu ne peux pas faire moins compliqué que ça ? Ca me paraît un peu plus chiadé que ce que ça pourrait être.

Par exemple, pourquoi est-ce qu'une solution à base de composition plutôt que d'héritage ne pourrait pas fonctionner ?
Laurent Gomila - SFML developer

kimci86

  • Full Member
  • ***
  • Messages: 128
    • Voir le profil
Re : Héritage virtuel de Drawable et Transformable
« Réponse #2 le: Juillet 14, 2012, 06:00:08 pm »
Citer
T'es sûr que tu ne peux pas faire moins compliqué que ça ?
Je trouve plutôt que c'est simple... Qu'est-ce qui vous semble tordu ?

Citer
une solution à base de composition
Je trouve dommage de rajouter des couches et des couches, en particulier pour ce qui concerne sf::Transformable. C'est tellement plus simple avec l'héritage...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Héritage virtuel de Drawable et Transformable
« Réponse #3 le: Juillet 14, 2012, 08:29:26 pm »
En fait quel est le but ? Peux-tu montrer le code que ça te permet d'écrire ?
Laurent Gomila - SFML developer

kimci86

  • Full Member
  • ***
  • Messages: 128
    • Voir le profil
Re : Héritage virtuel de Drawable et Transformable
« Réponse #4 le: Juillet 15, 2012, 11:17:01 am »
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). 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>.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Héritage virtuel de Drawable et Transformable
« Réponse #5 le: Juillet 15, 2012, 12:21:48 pm »
Citer
Le but est des transformer un Drawable existant en Widget tout en gardant l'interface de base.
Dans ce cas pourquoi est-ce que Widget dérive lui aussi de Drawable/Transformable ? Le fait est que tu te retrouves avec des doublons de classes dans ta hiérarchie, et ce n'est pas propre. Tenter de résoudre ça techniquement alors que c'est un problème de conception, ce n'est pas la meilleure solution.

A priori si tu fais une bibliothèque de GUI, tu as des classes un peu plus haut niveau que les classes SFML. Personnellement je fournirais plutôt des Picture/Label/... avec une interface complètement adaptée à la bibliothèque et les fonctions en plus qui vont bien, plutôt que de permettre d'utiliser les Sprite/Text/... directement.
Laurent Gomila - SFML developer