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 :

Référence vers un pointeur de fonction


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Par défaut Référence vers un pointeur de fonction
    Bonjour

    Commençons par un exemple simple. Ici, une struct Test qui possède un int, et une méthode pour accéder à cet int :

    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
    struct Test
    {
        int a;
     
        int& get()
        {
            return a;
        }
    };
     
    int main()
    {
        Test t;
        t.a = 42;
     
        return 0;
    }
    J'aimerais faire la même chose, plus avec un int, mais avec un pointeur de fonction. J'ai essayé ça, mais ça n'a pas l'air bon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Test
    {
        void (*function)(char&);
     
        void (*)(char&)& get()
        {
            return function;
        }
    };
    Quelle serait la bonne syntaxe, s'il vous plait ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Les pointeurs de fonctions en C++ sont "différents" (*) parce qu'il faut les spécifier:

    Il faut faire un truc comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef int& (Test::*func_01)();
     
    // ...
     
    Test test;
     
    func_01 func = &Test::get;
     
    int a = (test.*func)();

    * -> entre grosses guillemets

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Par défaut
    Voui, en fait pour l'instant je passe par un typedef, et j'avais réussi aussi à le faire avec un using :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // using FunctionPtr = void (*)(char&);
    typedef void (*FunctionPtr)(char&);
     
    FunctionPtr& get() {}
    Mais je cherche une écriture sans fioriture en fait. Sans typedef et sans using, du coup Pas possible ? Obligé de passer par un typedef ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <cstdio>
     
     
    struct Test {
    public:
     
        int func(int a, int b) {
            std::printf("a: %d, b: %d\n", a, b);
     
            return (a + b);
        }
    };
     
     
    typedef int (Test::*Test_Func)(int, int);
     
     
    int main()
    {
        Test_Func func = &Test::func;
     
        int (Test::* func2)(int, int) = &Test::func;
     
        Test t;
     
        std::printf("add 1: %d, add 2: %d\n", (t.*func)(16, 852), (t.*func)(782, 95));
     
        std::printf("add 1: %d, add 2: %d\n", (t.*func2)(895, 75), (t.*func2)(2, 842));
     
     
        return 0;
    }

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    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 : 760
    Par défaut
    void (*get())(char &) { return ...; }Ou comment rendre un code incompréhensible.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Par défaut
    Hum oui pas très clair effectivement.. Je vais plutôt m'orienter sur quelque chose proche de la solution de foetus

    Merci !!!

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Depuis C++11, on peut même utiliser un using tellement plus clair:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Test {
    public:
        using returned_function = int (Test::*)(int, int);
        returned_function get(int i) {
            return (i%2 == 0) ? &f2 : &f1;
        }
    private:
        int f2(int, int);
        int f1(int, int);
    };
    Par contre, tu ne dois par retourner une référence (surtout modifiante) sur un pointeur de fonction.

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

Discussions similaires

  1. Récupérer une référence vers le module contenant une fonction
    Par ProgVal dans le forum Général Python
    Réponses: 2
    Dernier message: 13/05/2010, 12h54
  2. Réponses: 1
    Dernier message: 09/04/2010, 11h15
  3. pointeur de methode vers pointeur de fonction
    Par yvesall dans le forum GTK+
    Réponses: 1
    Dernier message: 19/11/2008, 17h23
  4. Réponses: 10
    Dernier message: 28/08/2008, 18h15
  5. Réponses: 12
    Dernier message: 30/06/2006, 16h46

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