Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un pointeur de fonction, mais pour une méthode !

fonctionne pas ? o_O

    7 octobre 2007 à 19:00:18

    Bonjour ! :)

    Ma question est : Comment faire pointer un pointeur de fonction vers une méthode ?

    voila ce que j'aimerais faire :
    1. #include <iostream>
    2. class Test
    3. {
    4.         public:
    5.                 int additionner(int a, int b)
    6.                 {
    7.                         return a+b;
    8.                 }
    9. };
    10. int main()
    11. {
    12.         Test test;
    13.         int (*f)(int, int) = test.additionner;
    14.         std::cout << f(2, 4);
    15.         return 0;
    16. }


    06:59:24 antoinexp@antoinexp-laptop 19 [~/Desktop] $
    > g++ main.cpp -o class
    main.cpp: In function «int main()":
    main.cpp:17: erreur: argument of type «int (Test::)(int, int)" does not match «int (*)(int, int)"
    • Partager sur Facebook
    • Partager sur Twitter
      7 octobre 2007 à 19:06:07

      Bonsoir !

      En faisant une petite recherche sur google j'ai trouvé ceci : http://jlecomte.ifrance.com/c++/c++-faq-lite/pointers-to-members-fr.html
      J'espère que cela répondra à ta question :)
      • Partager sur Facebook
      • Partager sur Twitter
      Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
        7 octobre 2007 à 19:19:16

        Citation : iNaKoll

        Bonsoir !

        En faisant une petite recherche sur google j'ai trouvé ceci : http://jlecomte.ifrance.com/c++/c++-faq-lite/pointers-to-members-fr.html
        J'espère que cela répondra à ta question :)



        Merci ! c'est exactement ce que je cherchais ! :D

        voici ce que ça donne :

        1. #include <iostream>
        2. class Test
        3. {
        4.         public:
        5.                 static int additionner(int a, int b)
        6.                 {
        7.                         return a+b;
        8.                 }
        9. };
        10. int main()
        11. {
        12.         Test test;
        13.         int (*f)(int, int) = Test::additionner;
        14.         std::cout << f(2, 4);
        15.         return 0;
        16. }



        Mais une dernière question, concrètement, ça change quoi de déclarer une méthode en statique ?


        • Partager sur Facebook
        • Partager sur Twitter
          7 octobre 2007 à 19:28:26

          Grosso merdo, ca signifie que la méthode peut être appelée directement sans avoir à préciser d'objet.

          Test::MafonctionStatique();

          Un gros inconvénient : les fonctions membres statiques ne peuvent avoir accès qu'aux attributs statiques de la classe.
          • Partager sur Facebook
          • Partager sur Twitter
          Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
            7 octobre 2007 à 19:37:23

            Citation : neuneutrinos

            elle sont surtout global!!



            Je ne vois pas trop en quoi c'est un inconvénient en soi. :-°
            • Partager sur Facebook
            • Partager sur Twitter
            Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
            Anonyme
              7 octobre 2007 à 19:59:11

              Citation : neuneutrinos

              elle sont surtout global!!


              Pas tout à fait : elles appartiennen à un 'espace'. Et une fonction, si elle n'est pas globale (ou appartenante à un espace), tu veux qu'elle fonctionne comment?
              • Partager sur Facebook
              • Partager sur Twitter
                8 octobre 2007 à 18:33:16

                Citation : iNaKoll

                Un gros inconvénient : les fonctions membres statiques ne peuvent avoir accès qu'aux attributs statiques de la classe.


                Oui, là est tout mon problème ... :(
                • Partager sur Facebook
                • Partager sur Twitter
                  8 octobre 2007 à 18:41:26

                  hum, c'est pas vraiment bon de mettre static une méthode rien que pour ça...

                  à partir de ce tuto : http://linuxquality.sunsite.dk/articles/memberpointers/ (en anglais) :

                  1. int (Test::*f)(int,int) = &Test::additionner;


                  ce qui donnerais pour toi, tout simplement :

                  1. #include <iostream>
                  2. class Test
                  3. {
                  4.         public:
                  5.                 int additionner(int a, int b)
                  6.                 {
                  7.                         return a+b;
                  8.                 }
                  9. };
                  10. int main()
                  11. {
                  12.         Test test;
                  13.         int (Test::*f)(int, int) = &Test::additionner;
                  14.         std::cout << (test.*f)(2, 4) << std::endl;
                  15.         return 0;
                  16. }


                  je l'ai pas testé, mais je crois que je vais le faire.
                  ...
                  ouep, ça marche : compilation & exécution ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
                    8 octobre 2007 à 21:15:56

                    Oui, mais le problème en faite, c'est que c'est impossible d'utiliser une méthode pour fonction callback dans les signaux de gtk+ par exemple ! :(


                    Bon, sinon, je crois que le sujet est clos (résolu) ...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 octobre 2007 à 23:17:18

                      Mais si -> http://cpp.developpez.com/faq/cpp/?page=fonctions#CLASS_pblm_pointeur_fonction_membre

                      Après il y a effectivement des techniques plus modernes comme les signaux ... C++ (cf Qt, boost), boost.bind, etc.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                      Un pointeur de fonction, mais pour une méthode !

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown