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 :

Passer un méthode en paramètre d'une autre méthode


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Passer un méthode en paramètre d'une autre méthode
    Bonjour à toutes et à tous,

    Les pointeurs en C++ : ça me traumatise

    Je voudrais passer en paramètre d'une méthode una autre méthode. Je n'arrive pas à imaginer la syntaxe à employer.

    Soit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void a() {}
    void b() {}
     
    void c(// Qu'écrire ici pour utiliser a ou b) {
      // Qu'écrire ici pour que a ou b soit exécutée;
    }
     
    ...
     
    // appel de c pour utiliser a ou b
     
      c(// Qu'écrire ici pour utiliser a);
      c(// Qu'écrire ici pour utiliser b);
    Je suppose que a et b doivent avoir le même prototype.

    Merci pour votre aide.

    Pierre

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void a() {}
    void b() {}
     
    // Grosso modo
    void c(std::function<void()> f) {
      f();
    }
     
    ...
     
    // appel de c pour utiliser a ou b
     
      c(&a);
      c(&b);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void a() {}
    void b() {}
     
    void c(void (*f)()) {
      f();
    }
     
    ...
     
    // appel de c pour utiliser a ou b
     
      c(&a);
      c(&b);

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Bonjour,

    Laisse le compilateur te déterminer les types :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    template<class F>
    void foo(F&& fun)
    {
      //ici tu utilises fun comme une fonction :
      fun(0,1);
    }
     
    void bar(int,int){}
     
    //Pour passer bar à foo :
    foo(bar);
    C++11, en C++03 enlève juste la &&.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Citation Envoyé par Flob90 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    template<class F>
    void foo(F&& fun)
    {
      //ici tu utilises fun comme une fonction :
      fun(0,1);
    }
     
    void bar(int,int){}
     
    //Pour passer bar à foo :
    foo(bar);
    Pourquoi utiliser la move semantic et pas une référence ?

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Pourquoi utiliser la move semantic et pas une référence ?
    J'imagine que ça permet d'utiliser des foncteurs créés temporairement.
    Remarque au passage, la solution à base de template ne peut fonctionner que si l'appel de fonction se fait dans la même unité de compilation que celle où le template est défini.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par the Hound Voir le message
    J'imagine que ça permet d'utiliser des foncteurs créés temporairement.
    Le problème c'est qu'on ne pourra pas utiliser une std::function plusieurs fois.

    Est-ce qu'une référence constante ne marche pas pour les objets temporaires ?

  7. #7
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par the Hound Voir le message
    Remarque au passage, la solution à base de template ne peut fonctionner que si l'appel de fonction se fait dans la même unité de compilation que celle où le template est défini.
    J'ai du mal à voir le souci. Peux-tu donner un exemple où cela ne fonctionne pas ?

    Citation Envoyé par Neckara Voir le message
    Est-ce qu'une référence constante ne marche pas pour les objets temporaires ?
    Si, mais une référence sur membre constant t'interdit d'utiliser un foncteur avec l'opérateur () non const.
    Dans ce cas, il faut la move semantique ou faire une copie.

  8. #8
    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
    Si tu n'as pas C++11, seule la seconde solution marche, mais pour elle je conseille d'y ajouter un typedef pour manipuler le pointeur de fonction plus facilement:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef void (*void_func_ptr)();
     
    void c(void_func_ptr f) {
      f();
    }
    Note que cela marche pour les fonctions libres, ou les fonctions statiques d'une classe. Pour les fonctions membres non-statiques, c'est plus compliqué et je ne me souviens jamais de la syntaxe appropriée par cœur, obligé de chercher sur le net à chaque fois.
    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.

  9. #9
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pour les fonctions membres non-statiques, c'est plus compliqué et je ne me souviens jamais de la syntaxe appropriée par cœur, obligé de chercher sur le net à chaque fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class T {
      public:
        void toto(int);
    };
     
    void foo(void (T::*f)(int)) {
      T instance;
      (instance.*f)(42); // Pas sûr de mon coup
    }
     
    foo(&T::toto);

  10. #10
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci beaucoup the Hound

    Gela se compile très bien.

    Maintenant, je mets des variables dans a et b tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void a(int x) {}
    void b(int x) {}
     
    void c(void (*f)(int x)) {
      f(x);
    }
    mais j'obtiens une erreur :

    error: 'x' was not declared in this scope

    Désolé, je suis vraiment lourd.

    Cordialement.

    Pierre

  11. #11
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Citation Envoyé par ChPr Voir le message
    mais j'obtiens une erreur :

    error: 'x' was not declared in this scope
    C'est parce que ... tu n'as pas déclaré de x.
    Dans void c(void (*f)(int x)), le nom x est donné à titre indicatif mais le compilo n'y prête aucune attention.
    Tout ce qu'il sait et a besoin de savoir c'est que f renvoie void et prend un int.
    La seule variable qui est déclarée dans ta fonction c'est donc f, x n'existe pas.

  12. #12
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Il faut donc que j'écrive quelque chose dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void a(int x) {
    }
    void b(int x) {
    }
     
    void c(int v, void (*f)(int x)) {
      f(v);
    }
    v sera la valeur passée aux fonctions a ou b ?

    (je commence à y voir un peu plus clair, mais qu'est ce que j'ai du mal avec la syntaxe du C . Faut que je m'y mette)

    Cordialement.

    Pierre

  13. #13
    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
    Oui, c'est exactement ça.
    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.

Discussions similaires

  1. Comment passer en paramètre d'une méthode, une autre méthode ?
    Par Invité dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 31/03/2013, 03h59
  2. Réponses: 4
    Dernier message: 20/06/2007, 17h34
  3. [Tableaux] Passer paramètre sur une autre page
    Par lafmart dans le forum Langage
    Réponses: 1
    Dernier message: 04/02/2007, 16h29
  4. Réponses: 1
    Dernier message: 23/05/2006, 14h36
  5. Réponses: 7
    Dernier message: 06/05/2006, 15h06

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