IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Fonctions de classes de politiques par default


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Points : 41
    Points
    41
    Par défaut Fonctions de classes de politiques par default
    Bonjour,
    je code une sorte de wrapper autour de Glut pour la gestion de fenêtres OpenGL.
    Glut a une liste de callbacks que l'on n'est pas forcé de définir, par exemples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glutKeyboardFunc (keyboardFunc);
    glutMouseFunc (mouseFunc);
    Pour mon wrapper j'ai décidé de coder les callbacks sous forme de classes de politiques et de créer les nouvelles classes de fenêtres comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    struct MyCallbacks {
    static void keyboardFunc (uint8_t key, int x, int y) {
    // on gère le clavier
            }
    static void mouseFunc (int button, int state, int x, int y) {
    // on gère la souris
            }
    // etc...
    };
     
    template <typename CB>
    class GlutWindow {
     
    GlutWindow() {
    //...
    glutKeyboardFunc (CB::keyboardFunc);
    glutMouseFunc (CB::mouseFunc);
    }
     
    };
     
    typedef GlutWindow<MyCallbacks> MyWindow;
    Alors vous voyez surement apparaître le problème, s'il y a 15 callbacks, est-ce que je suis obligé de créer 15 fonctions dans ma politique qui resteront pour la plupart vides ?
    Ou alors existe-t-il un moyen d'utiliser des fonctions par default et de ne définir que les fonctions qui serviront à quelque chose ?

    Merci pour votre aide.

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Considérer que les callbacks d'une classe sont statiques et ne change jamais, ce n'est pas une bonne option. Il est préférable de passer par un système plus dynamique, qui permettra alors d'ajouter une callback (ou d'en enlever une) lorsque le besoin s'en fait sentir.

    Dans ce cadre, boost.signal est une alternative à étudier.

    Maintenant, pour ce qui est de répondre de manière précise à ta question : si ta politique fait des choses différentes, alors ce n'est pas une bonne politique, et elle doit être cassée en politiques plus petites.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    struct mouse_event_registerer
    {
      typedef void (*prototype)(int button, int state, int x, int y);
     
      static void do_register(prototype p)
      {
         glutMouseFunc(p);
      }
    };
     
    template <
      class Handler>
    struct handler_traits
    {
      typedef Handler handler_type;
      typedef typename handler_type::registerer_type hander_registerer;
      typedef typename handler_registerer::prototype handler_prototype;
     
      static void do_register(handler_prototype p)
      {
        hander_registerer::do_register(p);
      }
    };
     
    // les handlers d'évènement souris vont dériver de ce type, ce qui
    // va importer registerer_type dans le handler. Dans le cas contraire, 
    // on va simplement définir registerer_type dans la class handler,
    // quitte à donner un type qui n'est pas prévu par glut, pour faire
    // d'autres choses. 
    struct generic_mouse_handler
    {
      typedef mouse_event_registerer registerer_type;
    };
     
    // les struct héritent en public par défaut
    struct null_mouse_handler : generic_mouse_handler
    {
      void execute(int button, int state, int x, int y)
      { }
    };
     
    template <
      class WinEventHandler, 
      class MouseHandle = null_mouse_handler, 
      class KbHandler = null_kb_handler>
    class glut_window
    {
    public:
      typedef WinEventHandler winevent_handle_type;
      typedef MouseHandler mouse_handler_type;
      typedef KbHandler kb_handler_type;
    private:
      static void handle_mouse_event(int button, int state, int x, int y)
      {
        mouse_handler_type::execute(button, state, x, y);
      }
      ...
    public:
      glut_window()
      {
        event_traits<mouse_handler_type>::do_register(handle_mouse_event);
      }
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Et un court exemple, pour le "plaisir"
    struct my_mouse_handler : generic_mouse_handler
    {
      void execute(int button, int state, int x, int y)
      {
        std::cout << "b = " << button << ", x = " << x << ", y = " << y << std::endl;
      }
    };
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Points : 41
    Points
    41
    Par défaut
    Merci pour ta réponse, ton exemple est très intéressant.

    Par contre j'ai encore des soucis, principalement à cause des fonctions static que je semble forcé d'utiliser.

    Considérer que les callbacks d'une classe sont statiques et ne change jamais, ce n'est pas une bonne option. Il est préférable de passer par un système plus dynamique, qui permettra alors d'ajouter une callback (ou d'en enlever une) lorsque le besoin s'en fait sentir.
    Je ne vois pas en fait comment me passer des statics, à cause des fonctions que je dois passer en paramètre à glut. Pour faire :

    à ma connaissance p doit être soit une fonction globale soit une fonction membre statique. Maintenant l'approche statique me pose des problèmes pour la gestion de plusieurs fenêtres alors je suis encore dans une impasse.

    Je vais voir du côté de boost.signal, mais est-ce que ça règlerait ce problèmes de fonctions statiques en vue de gérer plusieurs fenêtres ?

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par arthurG Voir le message
    Merci pour ta réponse, ton exemple est très intéressant.

    Par contre j'ai encore des soucis, principalement à cause des fonctions static que je semble forcé d'utiliser.



    Je ne vois pas en fait comment me passer des statics, à cause des fonctions que je dois passer en paramètre à glut. Pour faire :

    à ma connaissance p doit être soit une fonction globale soit une fonction membre statique. Maintenant l'approche statique me pose des problèmes pour la gestion de plusieurs fenêtres alors je suis encore dans une impasse.

    Je vais voir du côté de boost.signal, mais est-ce que ça règlerait ce problèmes de fonctions statiques en vue de gérer plusieurs fenêtres ?
    Je me suis mal exprimé. Dans la phrase que tu as cité, statique est l'opposé de dynamique - c'est à dire qui peut être changé au runtime - et n'est pas lié au mot-clef C++.

    Effectivement, un pointeur sur fonction ne peut être initialisé qu'en référençant une fonction membre statique ou une fonction libre.

    glut n'est pas fait pour gérer plusieurs fenêtres, ni même plusieurs contextes. Pour gérer plusieurs fenêtre ou contextes de rendu, il faut aller au delà de glut - soit utiliser une autre librairie, soit directement le mode natif (GLX ou WGL ou autre selon la plateforme cible).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. Fonction qui classe par ordre croissant
    Par poupasol dans le forum Scheme
    Réponses: 4
    Dernier message: 12/01/2008, 19h25
  2. Fonctions et valeur par default
    Par Goundy dans le forum C
    Réponses: 5
    Dernier message: 27/02/2006, 22h16
  3. fonction et classe tempalte
    Par narkhor dans le forum C++
    Réponses: 8
    Dernier message: 29/03/2005, 09h57
  4. Valeur par default dans un input file ?
    Par alainme dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 11/02/2005, 14h31
  5. [VB6] Détecter le navigateur par default
    Par GeDeon35 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 13/12/2004, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo