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

Langage C++ Discussion :

fonction en paramètre d'une autre fonction


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif Avatar de JonathanTC
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2015
    Messages : 90
    Par défaut fonction en paramètre d'une autre fonction
    Bonjour,

    Je suis entrein de coder un menu pour un jeu.

    j'ajoute des bouton grâce a une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddButton("button name");
    J'aimerai faire un lien entre ce bouton est une fonction pour que quand je clique dessus mon programme lance ma fonction.

    Exemple: menu.AddButton("Play"); sa me lance la fonction void Play(void);

    j'ai pensé a metre un deuxieme parametre a cette fonction et lui donner l'adresse de la fonction mais je sais pas si la méthode est bonne quel est votre avis ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Salut,

    oui c'est une façon de faire. Ce dont tu as besoin s'apelle une callback, ça peut être sous forme de foncteur, std::function ou pointeur de fonction (et peut-être un autre procédé que j'ai pas en tête, ceux-ci étant les principaux).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre actif Avatar de JonathanTC
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2015
    Messages : 90
    Par défaut Problème à la compilation
    Game.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    menu.AddButton("Play",Game::Play);
    Menu.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne16  |   void AddButton(const char*,void (Game::*)());
    Menu.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Menu::AddButton(const char* ptext,void (Game::*ptr_function)())
    Compilateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ||=== Build: Debug in THELAST (compiler: GNU GCC Compiler) ===|
    include\Menu.h|16|error: expected ')' before '::' token|
    include\Menu.h|16|error: expected ')' before '::' token|
    include\Menu.h|16|error: expected ';' at end of member declaration|
    include\Menu.h|16|error: expected id-expression before '*' token|
    ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Utilises plutôt std::function, qui offre bien plus de souplesse que les pointeur de fonctions.

    Il faut en effet savoir que:
    1- les pointeurs sur des fonctions membres diffèrent en fonction de la classe à laquelle ils font référence: Avec deux classes exposant une fonction acceptant la même signature comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Alpha{
    public:
        void foo(int i);
    };
    class Beta{
    public:
        void foo(int i);
    };
    les pointeurs de fonctions qui correspondent sont de typevoid (Aplaha::*)(int) pour la classe Alpha et void (Beta::*)(int) pour ... Beta

    2- les fonctions membres statiques de classe ne posent pas ** trop ** de problème, mais les fonctions membre non statiques de classes présente une particularité irritante: celle de se voir adjoindre un paramètre (premier) de manière implicite par le compilateur: le fameux pointeur this qui désigne l'instance de la classe au départ de laquelle la fonction a été appelée.

    En utilisant std::function, il est possible de fournir des fonctions libres, des fonctions membres statiques, des fonctions membres non statiques et même des expressions lambda. Observe:
    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
    #include <iostream>
    #include <functional>
    class Button{
    public:
        void add(std::string const & text, std::function<void()> function){
            std::cout<<text<<" called : ";
            function();
        }
    };
    void freeFunction(){
        std::cout<<"free function called\n";
    }
    struct StaticStruct{
        static void staticFunction(){
            std::cout<<"static function called\n";
        }
    };
    struct Alpha{
        void nonStatic(){
            std::cout<<"member function called\n";
        }
        void parameterFun(int i){
            std::cout<<"member function with "<<i<<" as parameter\n";
        }
    };
    int main(){
        Button b;
        b.add("free function ", freeFunction);
        b.add("static function", StaticStruct::staticFunction);
        Alpha a;
        b.add("non static", [&](){a.nonStatic();});
        b.add("lambda",[](){    std::cout<<"lambda expression called\n";});
        b.add("using bind ",std::bind(&Alpha::nonStatic,&a));
        b.add("using bind for param",std::bind(&Alpha::parameterFun,&a, 5));
        return 0;
    }
    qui, une fois compilé produira la sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    philippe@philstower:~/Documents$ g++ test.cpp 
    philippe@philstower:~/Documents$ ./a.out 
    free function  called : free function called
    static function called : static function called
    non static called : member function called
    lambda called : lambda expression called
    using bind  called : member function called
    using bind for param called : member function with 5 as parameter
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre actif Avatar de JonathanTC
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2015
    Messages : 90
    Par défaut
    J'avou que std::function ç l'air pas mal pour ce que je veux réaliser. Je vais voir ce que je peux faire.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    A vrai dire, c'est plus que pas mal, c'est absolument génial!!!

    Le seul reproche que l'on pourrait faire à cette classe, c'est de n'être accessible qu'à partir de C++11. Mais bon, comme cela fait déjà 7 ans que cette version de la norme est sortie, et qu'il y a eu des évolutions supplémentaires au travers de C++14 et de C++17, on pourrait considérer comme criminel de ne pas encore avoir fait la transition (sauf cas très particulier, cela va de soi )

    Si cela t'intéresse, j'ai d'ailleurs mis au point un système de signaux et de slots en utilisant cette possibilité. En voici le code Signal.hpp

    Note que l'apparente longueur du code est essentiellement due aux commentaires présent afin de permettre à doxygen de générer la documentation, car, sans eux, cela correspondrait à moins de deux cents lignes de code
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. passer le nom d'une fonction comme paramètre d'une autre fonction?
    Par med_alpa dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 11/03/2010, 12h57
  2. Réponses: 16
    Dernier message: 26/05/2009, 13h32
  3. Réponses: 15
    Dernier message: 02/08/2007, 11h17
  4. fonction en paramètre d'une autre fonction
    Par zorobab dans le forum Général Python
    Réponses: 3
    Dernier message: 25/03/2007, 13h34
  5. [VB]Passage de Fonction en paramètre (d'une autre fonction)
    Par Australia dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 21/03/2006, 18h55

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