Partage
  • Partager sur Facebook
  • Partager sur Twitter

Classes

Appeler une fonction de la meme classe

    20 mars 2008 à 6:10:36

    Bonjour !

    J'ai une classe où il y a plusieurs fonctions. Par exemple, fonctionA() et fonctionB().

    Dans fonctionA(), je dois appeler fonctionB() qui se trouve dans la meme classe, comment dois-je faire ?
    J'ai essayé ceci : nom_de_classe::fonctionB() et fonctionB() tout court, ca ne marche pas !

    Comment dois-je faire ?

    Merci d'avance !
    A+
    • Partager sur Facebook
    • Partager sur Twitter
      20 mars 2008 à 6:39:42

      Les deux sont censées fonctionner, tout comme this->fonctionB().

      après il peut y avoir des incompatibilités (appeler une fonction non-const depuis une fonction const, appeler une fonction non-statique depuis une fonction statique, classes templates, ...), donc montre nous ton code ainsi que le message d'erreur, ça ira plus vite.
      • Partager sur Facebook
      • Partager sur Twitter
        20 mars 2008 à 11:21:59

        tu utilise la fonction comme d'habitude

        (definition de la fonction et utilisation de cette fonction dans une autre.

        P.S une fonction peut s'appeller elle même...
        • Partager sur Facebook
        • Partager sur Twitter
          21 mars 2008 à 2:03:31

          J'essai de construire une fenetre (Api Windows) dans une classe, donc j'ai créer une fonction procedureFenetre, que je dois renseigner dans mon constructeur :

          Je vous donne d'abbord le .h

          1. #include <windows.h>
          2. class Fenetre
          3. {
          4.     public:
          5.     Fenetre(); // constructeur
          6.     LRESULT CALLBACK Fenetre::procedureFenetre(HWND handle, UINT message, WPARAM wParam, LPARAM lParam);
          7.     private:
          8.     HWND handle;
          9.     MSG message;
          10.     WNDCLASS classeFenetre;
          11. };


          Maintenant, le fichier .cpp

          1. #include "fichier.h"
          2. Fenetre::Fenetre()
          3. {
          4.     this->classeFenetre.style=0;
          5.     this->classeFenetre.lpfnWndProc = this->procedureFenetre;
          6.     this->classeFenetre.cbClsExtra = 0;
          7.     this->classeFenetre.cbWndExtra = 0;
          8. }
          9. LRESULT CALLBACK Fenetre::procedureFenetre(HWND handle, UINT message, WPARAM wParam, LPARAM lParam)
          10. {
          11.     return DefWindowProc(handle, message, wParam, lParam);
          12. }


          Le problème est que la 6ème ligne (this->classeFenetre.lpfnWndProc = this->procedureFenetre;) fait planter le compilateur avec ce message :
          1. 6 fichier.cpp argument of type `LRESULT (Fenetre::)(HWND__*, UINT, WPARAM, LPARAM)' does not match `LRESULT (*)(HWND__*, UINT, WPARAM, LPARAM)'


          Demandez moi pas pourquoi je veut faire ça, une réponse suffit : que dois-je faire pour corriger ce bug ?
          Merci d'avance !
          • Partager sur Facebook
          • Partager sur Twitter
            21 mars 2008 à 3:05:55

            Bonsoir !

            Essaye ceci !

            1. this->classeFenetre.lpfnWndProc = this->procedureFenetre(/* Et les parenthèses ? Et les paramètres ? Ils sont où ? */);
            • Partager sur Facebook
            • Partager sur Twitter
            Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
              21 mars 2008 à 3:40:36

              Un pointeur sur fonction membre n'est pas un pointeur sur fonction non-membre. Or c'est ce dernier qu'attends Windows (c'est du C, fonctions membres connait pas).

              Il faut donc mettre ta callback en static dans ta classe, mais ensuite tu ne pourras plus appeler de fonctions membres. L'astuce typique est de placer le pointeur this dans les user data de la fenêtre pour le récupérer dans la callback et pouvoir faire des appels de fonctions membres.

              PS : ce n'est pas un appel de fonction ici, on prend juste son adresse. donc ni parenthèses ni paramètres...

              PPS : tout ça est expliqué dans la FAQ C++ de developpez.com (incompatibilités fonctions membres et fonctions non membres)
              • Partager sur Facebook
              • Partager sur Twitter
                21 mars 2008 à 4:40:22

                D'accord, merci de ton aide !

                Une autre question : quel est le type du pointeur contenant l'adresse d'une fonction membre et non membre ?
                • Partager sur Facebook
                • Partager sur Twitter
                  21 mars 2008 à 7:00:47

                  C'est dans la FAQ dont j'ai parlé précédemment.

                  En gros :
                  1. int NonMembre(float)      --> int(*)(float)
                  2. int Classe::Membre(float) --> int(Class::*)(float)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Classes

                  × 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