Passage de pointeur de fonction membre à une fonction

Passage de pointeur de fonction membre à une fonction - C++ - Programmation

Marsh Posté le 19-11-2003 à 11:57:15    

Bonjours  :hello: ,
Voilà mon problème:
J'ai une fonction qui reçoit en paramètre un pointeur de fonction (en l'occurrence

Code :
  1. GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void));

de glut.h) en générale cette fonction s'appel simplement comme ça : glutDisplayFunc(display);
Le problème est que j'ai voulu mettre le tout dans une class (la fonction display ainsi que l'appel à glutDisplayFunc()) mais le compilo n'a pas l'air d'apprécier:
glutDisplayFunc' : cannot convert parameter 1 from 'void (__thiscall Window<float,float,float>::*)(void)' to 'void (__cdecl *)(void)'
 
J'ai pensé à faire ceci : (on sais jamais)

Code :
  1. //declarer un nouveau pointeur de fonction membre:
  2. void  (Window<PosType, ColType, GlobalType>::*pfuncDisplay) (void);
  3. //l'initialiser dans le constructeur comme ceci:
  4. Window<PosType, ColType, GlobalType>::pfuncDisplay=(Window<PosType, ColType, GlobalType>::display);
  5. //et enfin appeler glutDisplayFunc() comme ça :
  6. glutDisplayFunc(Window<PosType, ColType, GlobalType>::pfuncDisplay);


mais ça change rien  :sweat:  
 
En fait avant d'être confronter à ce problème je ne savais même pas qu'il existait des pointeurs de fonction donc tout les conseils par rapport à leur manipulation sont les bienvenus.
Merci d'avance.
 :bounce:  

Reply

Marsh Posté le 19-11-2003 à 11:57:15   

Reply

Marsh Posté le 19-11-2003 à 12:00:11    

(:cry:)
 
Probleme archi classique a tendance bateau. Un pointeur de fonction (ce que veux GLUT) est different d'un pointeur de fnction membre (ce que tu lui refile)
 
Donc soit tu sors ta fonction de ta classe, soit tu la fous static (avec les a-coté que ce genre de manip amene)
 
 

Reply

Marsh Posté le 19-11-2003 à 14:01:31    

Utilise un wrapper c++ pour glut sinon ca va etre vite galere
 
http://www.stetten.com/george/glut [...] aster.html
http://www.mediaforge.net/~kgirard [...] apper.html
 

Reply

Marsh Posté le 19-11-2003 à 15:35:12    

ok,  
désolé pour la banalité mais merci beaucoup

Reply

Marsh Posté le 17-02-2004 à 15:18:43    

chrisbk a écrit :

(:cry:)
 
Probleme archi classique a tendance bateau. Un pointeur de fonction (ce que veux GLUT) est different d'un pointeur de fnction membre (ce que tu lui refile)
 
Donc soit tu sors ta fonction de ta classe, soit tu la fous static (avec les a-coté que ce genre de manip amene)
 


j'ai le même genre de problème (le classique pointeur de fonction membre != pointeur de fonction), et j'ai donc fait ce que tu as dit,  sorti la fonction, mais je dois pas faire ce qu'il faut apparemment (pas taper) :  

Code :
  1. dans le .h :
  2. void (*pF)(void);
  3. dans le .cpp :
  4. ...
  5. pF = &monObjet->Test; // j'ai deja une erreur C2276, ou C2440 sans le & ici, mais je vois pas cmt faire d'autre pour une fct non statique
  6. ...
  7. appel(pF);


ou test est une fonction non statique ne prenant rien en paramètre et ne retournant rien, d'une classe dont monObjet est une instance.
 
Je fais sûrement un truc de travers, si qqn pouvait me dire gentillement quoi...
 
merci


Message édité par sisicaivrai le 17-02-2004 à 15:21:17
Reply

Marsh Posté le 17-02-2004 à 16:25:34    

en supposant (espérant?) que ta méthode Test est bien une méthode statique de classe maClasse, alors:

Code :
  1. appel( maClasse::Test );

Reply

Marsh Posté le 17-02-2004 à 16:34:37    

ben non, elle n'est pas statique (j'aurais fait maClasse::Test) sinon je ne comprend pas l'explication de chrisbk disant : soit tu rends ta méthode statique, soit tu la sort de ta classe
 
On ne sait donc pas faire pointer vers une méthode non statique?
 
(edit : en essaytn ce que tu me dis, en mettant Test en statique, j'ai une error c2659 :sweat: )


Message édité par sisicaivrai le 17-02-2004 à 16:35:39
Reply

Marsh Posté le 17-02-2004 à 16:36:01    

sisicaivrai a écrit :

ben non, elle n'est pas statique (j'aurais fait maClasse::Test) sinon je ne comprend pas l'explication de chrisbk disant : soit tu rends ta méthode statique, soit tu la sort de ta classe
 
On ne sait donc pas faire pointer vers une méthode non statique?


 
un pointeur de fonction statique / non membre = 4 octets
ptr de fonction membre = 8 octets
 
y'a tout un pb de compatibilité de type la

Reply

Marsh Posté le 17-02-2004 à 16:40:14    

donc, on ne sait pas faire pointer vers une fonction non membre, non statique?
que veux-tu dire par "soit tu la sors de ta classe" ?


Message édité par sisicaivrai le 17-02-2004 à 16:40:24
Reply

Marsh Posté le 17-02-2004 à 16:43:42    

sisicaivrai a écrit :

donc, on ne sait pas faire pointer vers une fonction non membre, non statique?


 
si, on *peut* mais faut que ca soit prevu a la base, ce qui n'est pas le cas ici
 
 

Citation :

que veux-tu dire par "soit tu la sors de ta classe" ?


 
avant :

Code :
  1. class prout
  2. {
  3. void machin()
  4. }


 
apres

Code :
  1. void machin()
  2. class prout
  3. {
  4. }

Reply

Marsh Posté le 17-02-2004 à 16:43:42   

Reply

Marsh Posté le 17-02-2004 à 16:47:59    

1/ que ce soit prévu à la base?
 
2/ okkkk, tu la sors mais tu la met pas dans une autre classe :sol:
merci j'ai enfin compris ce que tu voulais dire et que fonction membre != fonction membre de cette classe-ci
 

Reply

Marsh Posté le 17-02-2004 à 17:41:49    

1) si mais quand tu utilises un truc C, faut pas trop en demander
2) avec des jolis objets fonctions template, ce problème n'existe pas en C++

Reply

Marsh Posté le 17-02-2004 à 18:06:06    

2/ je sais bien, mais quand tu veux utiliser des bibliothèques existantes, et qu'on te demande un pteur de fct, tu trouves un pteur de fct :/

Reply

Marsh Posté le 17-02-2004 à 18:14:17    

ben tu fais du C dans ce cas là, c'est tout. impossible d'exploiter les fonctionnalités du C++. d'ailleurs garde toi bien d'utiliser les exceptions, quand on mixe avec du C, ça fait très souvent des massacres (genre si ta fonction callback jète un truc, c'est la mort assurée)

Reply

Marsh Posté le 17-02-2004 à 18:17:43    

pourtant ils se revendiquent c++ :  
http://www.vtk.org/

Reply

Marsh Posté le 17-02-2004 à 18:27:19    

VTK ça l'ait un peu plus, mais ils sont rien capté avec leur ::New et ::Delete c'est abruti ... mais là on parle de GLUT APIENTRY et autres bordels purement en VC++ ?

Reply

Marsh Posté le 18-02-2004 à 09:45:31    

j'ai repris le post pour poser ma question sur vtk :)
pq c'est pas bien leurs New et Delete? (en fait je vois pas l'intérêt du truc :D )


Message édité par sisicaivrai le 18-02-2004 à 09:47:25
Reply

Marsh Posté le 18-02-2004 à 10:23:13    

parce que ça n'a pas d'intérêt, et qu'il y a des mécanismes beaucoup plus léger syntaxiquement pour empêcher la création d'objet sur la pile

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed