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 :

Manque de connaissance sur les map ou probleme de conception


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Points : 20
    Points
    20
    Par défaut Utilisation de Boost::function et Boost::bind
    Bonjour,

    Je souhaite réaliser une application en me basant sur le pattern MVC.
    Mais je me heurte a une difficulté technique qui pourrait venir d'un problème de conception.

    Je m'explique, ma classe contrôleur reçoit des commandes et j'ai voulu mappé les appels aux méthodes correspondantes. ça donne quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Control
    {
    map<int,void* (toto::*())> m_mappage; // int est un code qui correspond a une méthode
    }
    Les deux problèmes sont :
    - mes méthodes appelées ne peuvent être implémentées que dans la classe toto, et j'aurais préféré pouvoir appeler des méthodes dans différentes classes.
    - mes méthodes appelées ont un nombre d'arguments défini (dans mon exemple 0), et ça ne m'arrange pas non plus.

    Comme je ne vois pas trop comment réaliser ça sans une map, je vous demande un peu d'aide.

    Merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je te conseille de regarder boost::function et boost::bind qui ont été créé exprès pour introduire la flexibilité que tu souhaites. Il y a en outre la sur-couche boost::signal dont le but avoué est de gérer ce genre de choses.

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Points : 20
    Points
    20
    Par défaut
    ok, je regarde du coté de boost.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    Ya aussi une drole de solution XD.

    Faire un switch case et chaque numéro appel une fonction différente! C'est pas marrant ça XD.

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Points : 20
    Points
    20
    Par défaut
    le switch m'empêche de créer une méthode pour ajouter dynamiquement des commandes.

    Bon j'ai réduit mon problème en ayant des commandes qui devrait appeler des fonctions ayant toutes le même nombre d'argument. Il ne me reste plus que le problème des méthodes de différentes classes. je vois avec boost/signal qui semble être une solution finalement assez facile à mettre en place (même si j'aurais bien voulu savoir comment faire par mes propres moyens :o) ).

    maj: oui, bon, j'ai peut être été un peu vite sur le "finalement assez facile à mettre en place" :p

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Points : 20
    Points
    20
    Par défaut
    Petit exemple qui marche avec Boost :
    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
     
    typedef boost::function<void (long, std::string)>  m_function;
    class Control
    {
      map<int,m_function> m_mappage; // int est un code qui correspond a une méthode
    public:
      inline void add_command(int c, m_function function)
      {
        m_mappage[c] = function;
      }
      inline m_function get_command (int c)
      {
        return m_mappage[c];
      }
    };
    class Service
    {
    public:
      void affiche (int a, std::string b)
      {
        std::cout << a << " " << b << std::endl;
      }
    };
    void blabla(long c, std::string bla)
    {
      std::cout << c << " " << bla << std::endl;
    }
    int main()
    {
      Control c;
      Service b;
      c.add_command(1,boost::bind(&Service::affiche,boost::ref(b),_1,_2));
      c.add_command(2,boost::bind(&blabla,_1,_2));
     
      c.get_command (1)(12, "blabla");
      c.get_command (2)(25, "reblabla");
    }
    maj: correction

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Pour faire un équivalent de boost::signal toi même ce n'est pas bien compliqué, c'est une application simple du pattern Commande (mais après faut savoir l'exprimer en C++, idéalement avec des foncteurs, etc...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Questions sur les Map
    Par djobanaille dans le forum C++
    Réponses: 3
    Dernier message: 12/12/2005, 10h41
  2. Réponses: 24
    Dernier message: 27/09/2005, 22h16

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