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 :

map + function d'une classe


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Enseignant
    Inscrit en
    Septembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Points : 46
    Points
    46
    Par défaut map + function d'une classe
    Bonjour,

    je me casse les dents sur un problème tout simple: faire une map avec des string et en face des fonctions

    dans une classe de scripts, j'ai des mots en string qui correspondent à des fonctions du code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class scriptExecutor
    {
    public
     ...
    private:
     
    	int command_A(unsigned long int &wait);
    	int command_B(unsigned long int &wait);
    	int command_C(unsigned long int &wait);
            ...
    }
    Toutes les fonctions ont la même définition.

    puis dans mon code j'ai droit à ceci dans ma fonction d'analyse des mots:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (command=="A" )
       return command_A(wait);
     
    if (command=="B" )
       return command_B(wait);
    ...
    J'ai donc décidé de changer cela, aussi j'ai pensé à utiliser un map + function

    j'ai écris ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<std::string, std::function<int(unsigned long int &)>> listeCommande;
    mais je n'arrive pas à écrire la suite !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeCommande["A"] = scriptExecutor::command_A;
    me donne droit à un error: invalid use of non-static member function.

    Je comprends pourquoi, je n'ai pas défini correctement la map car une fonction de classe n'a pas le même prototype qu'une simple fonction .
    En fait, je ne sais pas faire et avec google je ne dois pas avoir les bons mots clefs.

    Je ne sais pas écrire non plus l'itérator:

    si command contient la valeur std:string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    it = listeCommande.find(commande);
    comment écrit on que le it->second doit utiliser l'argument (wait) ?

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Avec les pointeurs de fonction membre, il faut ajouter un paramètre qui est le type de la classe utilisée: std::function<int(scriptExecutor&, unsigned long&)>.

    L'attribution du pointeur de fonction se fait avec &: listeCommande["A"] = &scriptExecutor::command_A;.

    Et pour l'utilisation: it->second(instance_de_script_executor, wait)

  3. #3
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Si tu veux utiliser un std::function<int(unsigned long int &)>, il faudra y stocker deux informations : l'adresse d'un objet de type scriptExecutor et l'adresse d'une des fonctions scriptExecutor::command_A.
    On peut le faire, par exemple, avec un std::bind.

    Voici un lien vers la documentation de std::function :
    http://en.cppreference.com/w/cpp/uti...ional/function

    Voici un extrait de l'exemple de cette page, avec la solution que vient de te montrer jo_link_noir puis celle que je viens d'évoquer :
    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
    #include <functional>
    #include <iostream>
     
    struct Foo {
        Foo(int num) : num_(num) {}
        void print_add(int i) const { std::cout << num_+i << '\n'; }
        int num_;
    };
     
    // ...
     
    int main()
    {
        // store a call to a member function
        std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
        const Foo foo(314159);
        f_add_display(foo, 1);
     
        // ...
     
        // store a call to a member function and object
        using std::placeholders::_1;
        std::function<void(int)> f_add_display2 = std::bind( &Foo::print_add, foo, _1 );
        f_add_display2(2);
     
        // ...
    }

  4. #4
    Membre du Club
    Profil pro
    Enseignant
    Inscrit en
    Septembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Points : 46
    Points
    46
    Par défaut
    Merci beaucoup pour ces réponses rapides !

    Je vais travailler cela de suite.

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

Discussions similaires

  1. Init d'une const map dans une classe
    Par vdaanen dans le forum SL & STL
    Réponses: 4
    Dernier message: 15/01/2009, 15h03
  2. ajout d'attributs dans une classe de mapping
    Par nak dans le forum Hibernate
    Réponses: 2
    Dernier message: 17/07/2008, 17h54
  3. Réponses: 6
    Dernier message: 25/04/2008, 14h32
  4. mapping d une classe reflexive
    Par cdubet dans le forum Hibernate
    Réponses: 2
    Dernier message: 21/02/2007, 20h32
  5. Réponses: 5
    Dernier message: 26/05/2005, 15h40

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