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 :

Pointeur de fonctions sur méthode


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut Pointeur de fonctions sur méthode
    Bonjour, alors je suis en train de réaliser un petit programme, et je ne demande pas de réponse pour un TP quelconque (si seulement je faisais ca en cours )

    Donc j'ai une classe fait 2 3 trucs et je voudrais connecter les évènements de cette classe à une autre classe (cette classe peut etre hérité, ce n'est pas un problème). J'ai deja chercher sur le net, j'ai vu qu'on pouvait pas, fallais que la fonction soit static. Mais je peux pas.
    Pourtant il doit bien y avoir un moyen de le faire d'une facon ou d'une autre car avec GtkMM on connecte bien des signaux. Donc voila si vous pouviez me donner un point de départ ou une astuce pour faire ca, ca m'aiderais beaucoup

    merci d'avoir lu ce superbe message surement plein de fautes

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Par défaut
    Un pointeur sur fonction ce n'est pas un foncteur? il me semble.
    Bref si j'ai bien compris tu veux qu'une classe B soit à l'écoute de A et agisse en conséquence.
    Bon je vois pas trop comment faire.

  3. #3
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    salut,
    est-ce que ce petit bout de code peut t'aider ?
    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
    #include <iostream>
    using namespace std;
     
    class A
    {
    public:
    	int f(int);
    };
     
    int A::f(int n) 
    {
    	return n;
    }
     
    int main()
    {
    	int (A::*ptr)(int); // ptr est un pointeur sur méthode de A
    	ptr = A::f;         // ptr pointe sur A::f()
     
    	A una;
    	cout << (una.*ptr)(3) << endl; // appel de la méthode pointée par ptr pour l'objet una
    }

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    Sinon. Avec boost.function, tu trouveras tout ce qu'il faut pour recevoir des functions (membre ou non).
    Cf également boost.signal dans la thématique de ton problème.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Citation Envoyé par jmv
    salut,
    est-ce que ce petit bout de code peut t'aider ?
    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
    #include <iostream>
    using namespace std;
     
    class A
    {
    public:
    	int f(int);
    };
     
    int A::f(int n) 
    {
    	return n;
    }
     
    int main()
    {
    	int (A::*ptr)(int); // ptr est un pointeur sur méthode de A
    	ptr = A::f;         // ptr pointe sur A::f()
     
    	A una;
    	cout << (una.*ptr)(3) << endl; // appel de la méthode pointée par ptr pour l'objet una
    }
    Ca n'ira car la classe ou y'a la fonction pointé n'est pas connu a l'avance et faut que ca marche pour n'importe quel classe.

    Voila un peu le genre de truc que je veux

    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
     
    class Opla{
     
    public:
      void fonction()
      {
         cout << "Test" << endl;
      }
    };
     
    class Utile{
      void (*signal)();
    public:
      void signal_connect(void (*f)())
      {
         signal = f;
      }
     
      void fonction_truc()
      {
        //appel de la fonction pointé par signal
      }
    };




    Je vais regarder du coté de boost alors merci

    PS : Si d'autres ont des solutions je prend

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Je viens de tester avec boost, elle il aime pas non plus que je lui passe des méthode pour un ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::function<void (int, int, int)> f

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Regarde aussi boost::bind, ça va de paire avec boost::function
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Je pense pas que cela va convenir a mon programme, je vais essayer de détailler un peu plus.

    Donc j'ai une classe qui s'occupe d'afficher diverses choses. Cette classe doit etre réutilisable dans d'autres programmes. Et donc je voudrais rajouter la gestion d'évènements tel que le clic, l'appuie d'une touche ou autre.
    Et donc j'aimerais mettre des méthodes genre
    signal_connect_clic(fonction quand y'a un clic)


    Ou si j'ai mal vu sur le site de boost, si vous auriez d'autres sites qu'en parle en francais si possible, mais l'anglais ira bien

    merci

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    En utilisant juste boost::function et boost::bind :

    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
    enum BoutonSouris{/*...*/};
     
    struct Bouton
    {
      void signal_connect_clic(boost::function<void(BoutonSouris));
      void processEvents();
      typedef vector<boost::function<void(BoutonSouris)> > ClickHandlers;
      ClickHandlers my_click_handlers;
    };
     
    void Bouton::processEvents()
    {
      /*...*/
      for (ClickHandlers::iterator it = my_click_handlers.begin();
            it != my_click_handlers.end();
           ++it)
      {
         *it(buttonClicked);
      } 
    }
     
    struct Autre
    {
      void f(BoutonSouris bs);
    };
     
    void f(BoutonSouris bs, int autreDonnee);
     
    int main()
    {
      Bouton b;
      Autre a;
      b.signal_connect_clic(boost::bind(&A::f, boost::ref(a), _1));
      b.signal_connect_clic(boost::bind(f, _1, 42));
    }
    Sachant qu'il y a boost signal qui encapsule ça (je ne sais pas trop ce que ça apporte par rapport à function+bind, je n'ai jamais essayé.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Ca marche nickel, merci bien

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

Discussions similaires

  1. Pointeur de fonction sur des méthodes de QTime
    Par Gébix dans le forum Débuter
    Réponses: 1
    Dernier message: 22/07/2012, 11h40
  2. Pointeur de fonction sur fonction membre
    Par Trunks dans le forum C++
    Réponses: 8
    Dernier message: 27/09/2008, 16h26
  3. [Win32] Pointeur sur fonctions et méthodes de classe
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 13/09/2007, 19h07
  4. Transtypages sur des pointeurs de fonction
    Par gege2061 dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 05/01/2007, 15h01
  5. CreateThread sur une fonction membre (méthode)
    Par Kypper_667 dans le forum C++
    Réponses: 5
    Dernier message: 26/06/2006, 09h19

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