Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1262 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  pointeur de fonction membre d'une classe

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

pointeur de fonction membre d'une classe

n°761363
cricri_
Posté le 12-06-2004 à 18:55:48  profilanswer
 

Pour situer je ne suis pas top du tout en C++, pour ne pas dur nul ...
Alors j'ai besoin de déclarer un pointeur de fonction sur une fonction membre d'une classe, et je n'y arrive pas ...

Code :
  1. class CCompressor : public IAudioPlugin
  2. {
  3. public:
  4. CCompressor();
  5. virtual ~CCompressor();
  6. void        DoAudioProcessing();
  7. ...
  8. };


autre fichier

Code :
  1. extern class CCompressor   *pCompressor;
  2. void (*pf)(void) = pCompressor->DoAudioProcessing;


 
\Compressor\Misc.cpp(43): error C2440: 'initialisation' : impossible de convertir de 'overloaded-function' en 'void (__cdecl *)(void)'
 
c'est juste pour simplifier que j'ai pris cet example, car ça n'a aucun intérêt dans ce cas.

mood
Publicité
Posté le 12-06-2004 à 18:55:48  profilanswer
 

n°761364
Taz
bisounours-codeur
Posté le 12-06-2004 à 18:58:12  profilanswer
 

 void (*pf)(void)
 
déjà le (void) il sert à rien
 
ensuite, ceci ne marche qu'avec les fonctions ou les fonctions membres statiques
 
encore une fois, je recolle l'exemple de base
 

Code :
  1. #include <iostream>
  2. struct Foo
  3. {
  4.   void foo()
  5.   {
  6.     std::cout << "void Foo::foo()\n";
  7.   }
  8.   void foo(int)
  9.   {
  10.     std::cout << "void Foo::foo(int)\n";
  11.   }
  12.   void foo() const
  13.   {
  14.     std::cout << "void Foo::foo() const\n";
  15.   }
  16.   static void bar()
  17.   {
  18.     std::cout << "static void Foo::bar()\n";
  19.   };
  20. };
  21. int main()
  22. {
  23.   Foo obj;
  24.   Foo *ptr(&obj);
  25.   typedef void (Foo::*Foofoov)();
  26.   typedef void (Foo::*Foofooi)(int);
  27.   typedef void (Foo::*Foofoovc)() const;
  28.   Foofoov a(&Foo::foo);
  29.   Foofooi b(&Foo::foo);
  30.   Foofoovc c(&Foo::foo);
  31.   (obj.*a)();
  32.   (obj.*b)(42);
  33.   (obj.*c)();
  34.   (ptr->*a)();
  35.   (ptr->*b)(42);
  36.   (ptr->*c)();
  37. }

n°761365
cricri_
Posté le 12-06-2004 à 19:02:26  profilanswer
 

Merci Maître !  :jap:

n°761845
cricri_
Posté le 13-06-2004 à 16:39:47  profilanswer
 

Bon, ça fonctionne pour cet example, mais là c'est une autre paire de manche ...

Code :
  1. class CCompressor
  2. {
  3.     public:
  4. DLGPROC   CompressorProc( HWND hDlg, UINT uMsg, UINT wParam, LONG lParam);
  5. DLGPROC   FxProc( HWND hDlg, UINT uMsg, UINT wParam, LONG lParam);
  6. DLGPROC   (CCompressor::*pfDlg)( HWND hDlg, UINT uMsg, UINT wParam, LONG lParam);
  7. ...
  8. };


 
dans une fonction membre de la classe j'initialise le pointeur :

Code :
  1. pfDlg = &CCompressor::CompressorProc;


Et là où ça semble coincer c'est que dois utiliser ce truc dans une fonction membre statique :

Code :
  1. // From MSDN to use windows proc into a class
  2. /* ------------------------------------------------------------------------- */
  3. DLGPROC CCompressor::bdd_setupProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  4. /* ------------------------------------------------------------------------- */
  5. {
  6.     CCompressor    *p;
  7. ...
  8.     // and call its message proc method
  9.     if ( p != (CCompressor *)NULL) {
  10.         return( (p->*pfDlg)( hDlg, uMsg, wParam, lParam));
  11.     } else {
  12.         return( FALSE);
  13.     }
  14. }


là y a ces erreurs, alors que si j'appele directement la fonction c'est OK.
 
Misc.cpp(181): error C2568: '->*' : impossible de résoudre la surcharge de fonction
Misc.cpp(181): error C2597: référence non conforme à un membre non static 'CCompressor::pfDlg'


Message édité par cricri_ le 13-06-2004 à 16:41:06
n°761858
Taz
bisounours-codeur
Posté le 13-06-2004 à 17:04:32  profilanswer
 

tu fais chier avec ton code et ses windoseries vomitives .... maintenant ton pfDlgffdlùmhglùmjfdqlhjslkmhjsfdlkmhl c'est un membre d'instance, il va pas se matérialiser comme ça ... un bon point pour le message à la con de VC à 400km de la plaque (p->*(p->pfDlggflmgqjrfpogheqrgokhvqdrykothzorenb-yzot))( hDlg, uMsg, wParam, lParam)
 
 
une dernière
 
p != (CCompressor *)NULL   tu crois faire quoi là ?


Message édité par Taz le 13-06-2004 à 17:26:34
n°761870
cricri_
Posté le 13-06-2004 à 17:20:40  profilanswer
 

vi, s'pas grave ... je me débrouillerai autrement ...  :pfff:

n°761873
Taz
bisounours-codeur
Posté le 13-06-2004 à 17:25:51  profilanswer
 

de quoi ? je viens de" te donner la solution !

n°761877
cricri_
Posté le 13-06-2004 à 17:35:05  profilanswer
 

ben pfDlg est matérialisé à partir du moment où un objet de la clase compressor existe, et que ce pointeut a été initialisé précédemment : pfDlg = &CCompressor::CompressorProc;
non ? qu'est-ce que j'ai mal fait ?
a part les windowseries ...

n°761880
Taz
bisounours-codeur
Posté le 13-06-2004 à 17:37:36  profilanswer
 

dans la définition d'une fonction membre
 
pfDlg = &CCompressor::CompressorProc;
 
tu sous-entends this->
 
 
 
en dehors, y a plus de this-> qui tienne, il faut bien que tu rattaches ton membre à une instannce !

n°761886
cricri_
Posté le 13-06-2004 à 17:44:54  profilanswer
 

ok, c'est plus clair pour moi, le pb c'est que c'est dans une fonction statique, donc là c'est p qui devrait me rattacher le pointeur à l'instance, enfin c'est tout ce que j'ai il me semble.

mood
Publicité
Posté le 13-06-2004 à 17:44:54  profilanswer
 

n°761887
Taz
bisounours-codeur
Posté le 13-06-2004 à 17:46:35  profilanswer
 

Taz a écrit :

void (*pf)(void)
 
déjà le (void) il sert à rien
 
ensuite, ceci ne marche qu'avec les fonctions ou les fonctions membres statiques

:o

n°761892
cricri_
Posté le 13-06-2004 à 18:07:54  profilanswer
 

c'est bien mon cas ça, ce pointeur de fonction est utilisé dans une fonction membre statique, par contre son initialisation est effectuée dans une fonction membre.
Bon, je sens que ça ne va pas être possible mon histoire ..

n°761893
Taz
bisounours-codeur
Posté le 13-06-2004 à 18:09:54  profilanswer
 

et comment veut tu que ça soit possible ?

n°761896
cricri_
Posté le 13-06-2004 à 18:13:54  profilanswer
 

ce que je ne comprends pas c'est pourquoi ce n'est pas possible, car si je remplace le pointeur de fonction par la fonction ça marche.
Mais c'est clair qu'il doit y avoir un truc qui m'échappe.

n°761897
Taz
bisounours-codeur
Posté le 13-06-2004 à 18:15:25  profilanswer
 

ben une fonction membre statique n'est rattachée à aucune instance. une fonction membre non statique l'est. ce sont 2 choses bien différentes .| t'as pas l'air de comprendre ces concepts


Message édité par Taz le 13-06-2004 à 18:15:59
n°761902
cricri_
Posté le 13-06-2004 à 18:22:31  profilanswer
 

sissi j'ai bien compris, mais puisque dans cette fonction statique je récupère un pointeur sur cette instance, p en l'occurence, je ne pige pas pourquoi je peux faire :

Code :
  1. (p->CompressorProc)( hDlg, uMsg, wParam, lParam);


 
mais pas :

Code :
  1. (p->*pDlg)( hDlg, uMsg, wParam, lParam);


alors que pDlg a été déclaré précédemment dans une fonction membre :

Code :
  1. pfDlg = &CCompressor::CompressorProc;


[edit correction]


Message édité par cricri_ le 13-06-2004 à 18:23:10
n°761905
Taz
bisounours-codeur
Posté le 13-06-2004 à 18:24:23  profilanswer
 

parce que. et si t'appelles une fonction statique avec un instance, t'as un gros problème :o

n°761909
strobo
My words are made of silence
Posté le 13-06-2004 à 18:26:51  profilanswer
 

Taz a écrit :

tu fais chier avec ton code et ses windoseries vomitives .... maintenant ton pfDlgffdlùmhglùmjfdqlhjslkmhjsfdlkmhl c'est un membre d'instance, il va pas se matérialiser comme ça ... un bon point pour le message à la con de VC à 400km de la plaque (p->*(p->pfDlggflmgqjrfpogheqrgokhvqdrykothzorenb-yzot))( hDlg, uMsg, wParam, lParam)
 
 
une dernière
 
p != (CCompressor *)NULL   tu crois faire quoi là ?


 
 
 
Bjarn Stroustrup a écrit : "J'ai appris beaucoup de choses en écrivant ce livre car celui qui connaitrait tout du C++ n'est pas encore né" (où plus précisemment, il dit "n'existe pas encore" )  
 


---------------
"Je suis si intelligent que mon cerveau est mon deuxième organe favori".
n°761912
Taz
bisounours-codeur
Posté le 13-06-2004 à 18:32:13  profilanswer
 

et ?

n°761914
cricri_
Posté le 13-06-2004 à 18:36:31  profilanswer
 

je n'ai pas le choix, c'est une windowserie ... les fonctions appelées à la création d'une boîte de dialogue ne peuvent pas être des fonctions membres, donc il faut appeler une fonction statique ou non membre, dans mon cas c'est une fonction statique, on passe l'instance (this) en paramètre que l'on récupère dans la fonction statique afin d'appeler la fonction membre ...
Je suis bien d'accord que c'est du pure windaube, mais bon, j'essaye de faire avec ...
Et donc je ne vois pas bien comment faire autrement, hormis déclarer un enum qui me permettra de choisir la fonction à appeler, mais je trouve ça assez crade ...


Message édité par cricri_ le 13-06-2004 à 18:37:29
n°761920
Taz
bisounours-codeur
Posté le 13-06-2004 à 18:45:46  profilanswer
 

ben dans les fonctions callback non template, on mets souvent un argument genre *userdata, comme ça ton cb est appelé avec et là tu peux travailler. sinon, t'es foutu

n°761924
cricri_
Posté le 13-06-2004 à 18:53:55  profilanswer
 

vi, y a ça, mais il est déjà utilisé pour passer l'instance (this).
.. mais tu viens de me donner une idée, je vais essayer de passer le pointeur de fonction plutôt que l'instance ;)

n°761934
Taz
bisounours-codeur
Posté le 13-06-2004 à 18:58:42  profilanswer
 

et ben si tu passe l'instances, il est ou le problème : rien ne t'empeche de faire une fonction statique avec en paramètre une instance :o

n°761951
cricri_
Posté le 13-06-2004 à 19:07:40  profilanswer
 

Mais c'est bien ce qui était fait, pourtant j'avais tjs cette erreur !

n°761955
Taz
bisounours-codeur
Posté le 13-06-2004 à 19:14:54  profilanswer
 

non, c'est pas ce qui était fait

n°761964
cricri_
Posté le 13-06-2004 à 19:26:38  profilanswer
 

Ah ? bon, je récapitule alors, voilà ce que j'ai fait :

Code :
  1. class CCompressor : public IAudioPlugin
  2. {
  3. public:
  4.     static DLGPROC  bdd_setupProc( HWND hwndDlg, UINT uMsg,
  5.                                    WPARAM wParam, LPARAM lParam);
  6.     DLGPROC         PluginAudioProc( HWND hDlg, UINT uMsg,
  7.                UINT wParam, LONG lParam);
  8. DLGPROC   CompressorProc( HWND hDlg, UINT uMsg, UINT wParam, LONG lParam);
  9. DLGPROC   FxProc( HWND hDlg, UINT uMsg, UINT wParam, LONG lParam);
  10. DLGPROC   (CCompressor::*pfDlg)( HWND hDlg, UINT uMsg, UINT wParam, LONG lParam);
  11. ....


 
pfDlg est initialisé dans une fonction membre :

Code :
  1. pfDlg = &CCompressor::CompressorProc;


 
et la fonction statique en entier :

Code :
  1. // From MSDN to use windows proc into a class
  2. /* ------------------------------------------------------------------------- */
  3. DLGPROC CCompressor::bdd_setupProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  4. /* ------------------------------------------------------------------------- */
  5. {
  6.     CCompressor *p;
  7.     switch ( uMsg) {
  8.     case WM_INITDIALOG :
  9.         // This message is how we identify the dialog object.
  10.         // get a pointer to the class object.
  11.         p = (CCompressor *)lParam;
  12.         // set its USERDATA word to point to the class object
  13.         SetWindowLong( hDlg, GWL_USERDATA, (long)p);
  14.         break;
  15.     default :
  16.         // get a pointer to the class object
  17.         p = (CCompressor *)GetWindowLong( hDlg, GWL_USERDATA);
  18.         break;
  19.     }
  20.    
  21.     // and call its message proc method
  22.     if ( p != (CCompressor *)NULL) {
  23.         return((p->*pfDlg)( hDlg, uMsg, wParam, lParam));
  24.     } else {
  25.         return( FALSE);
  26.     }
  27. }


et dans cette fonction statique si je remplace p->*pfDlg par p->CompressorProc ça fonctionne.
 
rappel des erreurs :
Misc.cpp(181): error C2568: '->*' : impossible de résoudre la surcharge de fonction
Misc.cpp(181): error C2597: référence non conforme à un membre non static 'CCompressor::pfDlg'


Message édité par cricri_ le 13-06-2004 à 19:27:42
n°761987
Taz
bisounours-codeur
Posté le 13-06-2004 à 19:47:48  profilanswer
 

et tu persistes et signes ... débrouilles toi tout seul

n°761993
cricri_
Posté le 13-06-2004 à 19:54:43  profilanswer
 

???
S'il n'y a pas de solution suffit de me le dire, sinon j'aimerai bien la connaitre


Message édité par cricri_ le 13-06-2004 à 19:57:03
n°761996
Taz
bisounours-codeur
Posté le 13-06-2004 à 19:58:49  profilanswer
 

j'aimerais juste que tu arrêtes de balancer tes windowseries
 
class CCompressor : public IAudioPlugin
  {
    public:
        static DLGPROC  bdd_setupProc( HWND hwndDlg, UINT uMsg,
                                       WPARAM wParam, LPARAM lParam);
        DLGPROC         PluginAudioProc( HWND hDlg, UINT uMsg,
                    UINT wParam, LONG lParam);
     DLGPROC   CompressorProc( HWND hDlg, UINT uMsg, UINT wParam, LONG lParam);
     DLGPROC   FxProc( HWND hDlg, UINT uMsg, UINT wParam, LONG lParam);
     DLGPROC   (CCompressor::*pfDlg)( HWND hDlg, UINT uMsg, UINT wParam, LONG lParam);  
 
je vois ça, je quitte direct, j'ai pas envie de lire ce genre de ramassi

n°761998
Taz
bisounours-codeur
Posté le 13-06-2004 à 20:00:07  profilanswer
 

surtout que tu t'entêtes à balancer tes immondices sans prendre en compte mes réflexions : le problème est le même qu'au début

n°762000
cricri_
Posté le 13-06-2004 à 20:02:27  profilanswer
 

ok, malheureusement mon pb est lié à ce contexte ...
Bon bah tant pis.

n°762003
Taz
bisounours-codeur
Posté le 13-06-2004 à 20:04:11  profilanswer
 

tant pis pour toi, je t'ai pourtant filé la solution

n°762020
strobo
My words are made of silence
Posté le 13-06-2004 à 20:33:31  profilanswer
 


 
et que tu devrais relire la phrase plusieurs fois, tous les matins.  


---------------
"Je suis si intelligent que mon cerveau est mon deuxième organe favori".
n°762041
Taz
bisounours-codeur
Posté le 13-06-2004 à 21:06:35  profilanswer
 

strobo a écrit :

et que tu devrais relire la phrase plusieurs fois, tous les matins.

c'est parce que je te fais pas un rapport tous les jours que j'apprends pas. je suis arrivé sur le forum il n'y a pas si longtemps. et j'apprends tous les jours, pas sur le forum évidemment. je vois pas pourquoi tu essaies de m'approprier ce genre de pensée

n°762055
cricri_
Posté le 13-06-2004 à 21:17:46  profilanswer
 

Taz a écrit :

tant pis pour toi, je t'ai pourtant filé la solution


possible, maintenant j'ai annoncé la couleur dès le début, suis pas top en C++, maintenant j'ai certainement raté qqchose mais je ne vois pas.

n°762062
Taz
bisounours-codeur
Posté le 13-06-2004 à 21:21:46  profilanswer
 

je te dis que ton sdlhgqsdlkhgsdlkghklqghqslkghlfqghklqgqdlghlqdghi c'est un membre, alors écris le comme un membre

n°762093
cricri_
Posté le 13-06-2004 à 21:46:23  profilanswer
 

T'es vraiment le pire des chi*nt, mais t'es génial !!!  :love:  
 :jap: merci

n°762096
Taz
bisounours-codeur
Posté le 13-06-2004 à 21:47:34  profilanswer
 

Taz a écrit :

maintenant ton pfDlgffdlùmhglùmjfdqlhjslkmhjsfdlkmhl c'est un membre d'instance, il va pas se matérialiser comme ça ... un bon point pour le message à la con de VC à 400km de la plaque (p->*(p->pfDlggflmgqjrfpogheqrgokhvqdrykothzorenb-yzot))( hDlg, uMsg, wParam, lParam)

j'aime pas qu'on me fasse répéter

n°762107
cricri_
Posté le 13-06-2004 à 21:55:03  profilanswer
 

vi, maintenant que j'ai compris je réalise que tu m'avais donné la solution, maintenant à coup de hjdsqmiuiazeadjkldjlkzdlz, pas facile non plus ... pire que des windauberies ... ;)
mais j'avais pas mal cherché sur l'histoire, et je n'ai rien trouvé sur les pointeurs de fonctions membre d'une classe, si tu as qqs URLs suis preneur, même si là je crois avoir compris.
Encore merci .  :jap:

n°762126
Taz
bisounours-codeur
Posté le 13-06-2004 à 22:16:07  profilanswer
 

ben flfhdfhqfhflmdhfsqdhmlfqsdfsq c'est aussi compréhensible de prime abord que pfdl

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  pointeur de fonction membre d'une classe

 

Sujets relatifs
equivalent classe builder[CSS] plusieur feuilles de styles en fonction d'un choix
Fonction non bloquante sous telnetfonction split
Saisir le nom que l'on veut attribuer à une instance de classe[resolu]Ais je bien passer les arguments par adresse à ma fonction ?
Comment appeler une fonction à l'aide d'un pointeur sur cette fonctionfonction pour connexion serveur + regex
[Websphere] fonction split() de la classe String non implémenté ?[C++] Pointeur de fonction sur membre d'une classe
Plus de sujets relatifs à : pointeur de fonction membre d'une classe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR