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 :

lancer une fonction membre grace à une chaine de caracteres


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Par défaut lancer une fonction membre grace à une chaine de caracteres
    Bonjour,

    Mon but est de créer une classe Interpreter qui gère l'interprétation d'un message sous forme de chaine de caractère : KEYWORD1 param1.1 param1.2 ... KEYWORD2 param2.1 param2.2 ...

    Pour ce faire, je commence par initialiser une std::map en associant un pointeur vers une fonction de traitement membre à un mot clef.

    Mes fonctions de traitement sont toutes construites sur le même modèle :
    bool myFunction(std::vector<std::string> params).

    J'ai enfin une fonction readMessage(const std::string& keyword,std::vector<std::string>) qui lancera la bonne fonction de traitement en fonction du mot clef.

    D'autres fonctions gèrent le découpage de la chaine en entrée mais là n'est pas le problème.
    En fait le compilo me jète lorsque je remplis ma map en me disant que je ne peux pas referencer une fonction membre liée :
    error C2276: '&': opération non conforme sur l'expression d'une fonction membre liée.

    Voilà mon code :

    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
     
    typedef bool (*read_func)(std::vector<std::string>);
     
    class Interpreter
    {
    private:
       std::map<std::string,read_func> funcTab;
     
    public:
       void init();
       bool readMessage(const std::string& keyword, std::vector<std::string> params);
       bool readFunc1(std::vector<std::string> params);
       bool readFunc2(std::vector<std::string> params);
       //...
    };
     
    void Interpreter::init()
    {
       funcTab["KEY1"] = &readFunc1;
       funcTab["KEY2"] = &readFunc2;
       //...
    }
     
    bool Interpreter::readMessage(const std::string& keyword,std::vector<std::string> params)
    {
       std::map<std::string,read_func>::const_iterator element = funcTab.find(keyword);
     
       if (element == funcTab.end())
          return false;
       else
          return (iter->second)(params);
    }
    Si quelqu'un a une idée ? Merci d'avance

  2. #2
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    funcTab["KEY1"] = &readFunc1;
    funcTab["KEY2"] = &readFunc2;
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       funcTab["KEY1"] = &Interpreter::readFunc1;
       funcTab["KEY2"] = &Interpreter::readFunc2;
    Car en C++ on ne peut avoir que des pointeurs sur membres de classes et non pas des pointeurs sur instances de classes.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Par défaut
    Après modif j'ai une nouvelle erreur :

    error C2440: '=' : impossible de convertir de 'bool (__thiscall Interpreter::* )(std::vector<_Ty>)' en 'bool (__cdecl *)(std::vector<_Ty>)'
    1> with
    1> [
    1> _Ty=std::string
    1> ]
    1> Aucun contexte dans lequel cette conversion est possible

  4. #4
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Encore une chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef bool (*read_func)(std::vector<std::string>,void*);
    Déclare un type "pointeur de fonction", ce qui est incompatible avec "&Interpreter::readFunc1" qui est de type "pointeur sur fonction de classe".

    Voilà pourquoi tu as ce message d'erreur du compilateur.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Par défaut
    Ok c'est bien ça

    je remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef bool (*read_func)(std::vector<std::string>);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class Interpreter;
     
    typedef bool (Interpreter::*read_func)(std::vector<std::string>);
    et ça marche nickel !
    Merci beaucoup.

  6. #6
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Une dernière chose, pour effectuer un appel à la fonction il te faudra :
    - un pointeur sur fonction membre de classe
    - un pointeur sur une instance de la classe
    - utiliser l'opérateur "->*"

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Interpreter *obj_ptr;
    Interpreter::*read_func func_ptr;
    
    obj_ptr = new Interpreter;
    obj_ptr->init();
    func_ptr = obj_ptr->funcTab["KEY1];
    
    obj_ptr->*func_ptr(...);

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par anoward Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef bool (*read_func)(std::vector<std::string>);
     
    class Interpreter
    {
       bool readMessage(const std::string& keyword, std::vector<std::string> params);
       bool readFunc1(std::vector<std::string> params);
       bool readFunc2(std::vector<std::string> params);
    };
    Pourquoi toujours passer des vector<string> par valeur?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Par défaut
    Pour l'instant peu importe. C'est pas le problème. Mais on peut parfaitement utiliser des références vers le message d'origine. D'ailleurs c'est ce que je fais dans mon code chez moi.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il ne demande pas pourquoi tu passes des vector<string>, il demande pourquoi tu les passes par valeur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Par défaut
    oui je m'en suis aperçu après avoir écris le premier message. Woa zet rapides à répondre

  11. #11
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par anoward Voir le message
    oui je m'en suis aperçu après avoir écris le premier message. Woa zet rapides à répondre
    On a l'oeil ...

Discussions similaires

  1. [Free Pascal] Enregistrer une fonction callback depuis une fonction membre
    Par EpiTouille dans le forum Free Pascal
    Réponses: 3
    Dernier message: 11/03/2015, 11h11
  2. Thread d'une fonction membre dans une fonction membre
    Par virtual_bug dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 19/03/2014, 21h49
  3. Réponses: 5
    Dernier message: 29/06/2006, 17h23
  4. Réponses: 3
    Dernier message: 29/04/2006, 13h02
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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