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 régulier
    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
    Points : 105
    Points
    105
    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 ?
    "There should be no boundaries to human endeavor" - Hawking
    Retrouvez moi sur GitHub : https://github.com/JeanLouisMassei

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    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 629
    Points : 10 554
    Points
    10 554
    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 régulier
    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
    Points : 105
    Points
    105
    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 ?
    "There should be no boundaries to human endeavor" - Hawking
    Retrouvez moi sur GitHub : https://github.com/JeanLouisMassei

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    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 629
    Points : 10 554
    Points
    10 554
    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
    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
    void (*get())(char &) { return ...; }Ou comment rendre un code incompréhensible.

  6. #6
    Membre régulier
    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
    Points : 105
    Points
    105
    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 !!!
    "There should be no boundaries to human endeavor" - Hawking
    Retrouvez moi sur GitHub : https://github.com/JeanLouisMassei

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    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.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

+ 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