J'ai un léger problème et j'aimerais avoir votre avis.
J'ai une classe dans laquelle je dois utiliser l'adresse d'une fonction
membre, qui du coup a dû être déclarée static. Jusque là pas de problème
(voir le code ci-dessous, c'est ma fonction TWindow::WndProc).
Seulement, dans cette fonction j'ai besoin de faire des appels à d'autres
fonctions membres qui ne sont pas statiques (par exemple ma fonction
TWindow::WMPaint).
Je pense que vous voyez bien le but que je cherche à atteindre :-)
Et bien sûr, l'appel d'une fonction non statique à partir d'une fonction
statique est interdit.
Que me conseillez-vous ???
Comme d'habitude : faire en sorte que la fonction statique soit appelée avec l'adresse de l'objet concerné.
???
Merci, mais pourrais-tu être un peu plus précis ?
Marc.
Loïc Joly
Marc Lebrun wrote:
Comme d'habitude : faire en sorte que la fonction statique soit appelée avec l'adresse de l'objet concerné.
???
Merci, mais pourrais-tu être un peu plus précis ?
En général, les fonctions callback peuvent prendre un paramètre dans lequel on peut faire passez n'importe quoi. Passe donc dans ce paramètre l'adresse de l'objet dont tu souhaite appeller une fonction membre, et dans la fonction statique, recaste ce paramètre dans le bon type, et appèèle la fonction membre sur ce pointeur.
-- Loïc
Marc Lebrun wrote:
Comme d'habitude : faire en sorte que la fonction statique soit
appelée avec l'adresse de l'objet concerné.
???
Merci, mais pourrais-tu être un peu plus précis ?
En général, les fonctions callback peuvent prendre un paramètre dans
lequel on peut faire passez n'importe quoi. Passe donc dans ce paramètre
l'adresse de l'objet dont tu souhaite appeller une fonction membre, et
dans la fonction statique, recaste ce paramètre dans le bon type, et
appèèle la fonction membre sur ce pointeur.
Comme d'habitude : faire en sorte que la fonction statique soit appelée avec l'adresse de l'objet concerné.
???
Merci, mais pourrais-tu être un peu plus précis ?
En général, les fonctions callback peuvent prendre un paramètre dans lequel on peut faire passez n'importe quoi. Passe donc dans ce paramètre l'adresse de l'objet dont tu souhaite appeller une fonction membre, et dans la fonction statique, recaste ce paramètre dans le bon type, et appèèle la fonction membre sur ce pointeur.
-- Loïc
Marc Boyer
Marc Lebrun wrote:
Je pense que vous voyez bien le but que je cherche à atteindre :-) Et bien sûr, l'appel d'une fonction non statique à partir d'une fonction statique est interdit. Que me conseillez-vous ???
class Foo { public: int bar(Param p); // methode non statique }; int barWrapper(Foo& item, Param p){ // fonction que tu peux // passer à ton callback return item.bar(p); }
Marc Boyer -- Lying for having sex or lying for making war? Trust US presidents :-(
Marc Lebrun wrote:
Je pense que vous voyez bien le but que je cherche à atteindre :-)
Et bien sûr, l'appel d'une fonction non statique à partir d'une fonction
statique est interdit.
Que me conseillez-vous ???
class Foo {
public:
int bar(Param p); // methode non statique
};
int barWrapper(Foo& item, Param p){ // fonction que tu peux
// passer à ton callback
return item.bar(p);
}
Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(
Je pense que vous voyez bien le but que je cherche à atteindre :-) Et bien sûr, l'appel d'une fonction non statique à partir d'une fonction statique est interdit. Que me conseillez-vous ???
class Foo { public: int bar(Param p); // methode non statique }; int barWrapper(Foo& item, Param p){ // fonction que tu peux // passer à ton callback return item.bar(p); }
Marc Boyer -- Lying for having sex or lying for making war? Trust US presidents :-(
Marc Lebrun
En général, les fonctions callback peuvent prendre un paramètre dans lequel on peut faire passez n'importe quoi. Passe donc dans ce paramètre l'adresse de l'objet dont tu souhaite appeller une fonction membre, et dans la fonction statique, recaste ce paramètre dans le bon type, et appèèle la fonction membre sur ce pointeur.
-- Loïc
Ah ok j'ai compris :-) Le problème c'est que ma fonction statique est une WNDPROC de Windows, dans le constructeur de TWindow je donne simplement wndclass.lpfnWndProc WndProc (qui ne marche que si WndProc est un membre statique). A la limite je reçois dans les paramètres le HWND de la fenêtre, c'est tout... Je vais peut-être regarder du côté de WNDCLASSEX ???
Merci pour vos réponses.
Marc.
En général, les fonctions callback peuvent prendre un paramètre dans
lequel on peut faire passez n'importe quoi. Passe donc dans ce paramètre
l'adresse de l'objet dont tu souhaite appeller une fonction membre, et
dans la fonction statique, recaste ce paramètre dans le bon type, et
appèèle la fonction membre sur ce pointeur.
--
Loïc
Ah ok j'ai compris :-)
Le problème c'est que ma fonction statique est une WNDPROC de Windows, dans
le constructeur de TWindow je donne simplement wndclass.lpfnWndProc WndProc (qui ne marche que si WndProc est un membre statique).
A la limite je reçois dans les paramètres le HWND de la fenêtre, c'est
tout...
Je vais peut-être regarder du côté de WNDCLASSEX ???
En général, les fonctions callback peuvent prendre un paramètre dans lequel on peut faire passez n'importe quoi. Passe donc dans ce paramètre l'adresse de l'objet dont tu souhaite appeller une fonction membre, et dans la fonction statique, recaste ce paramètre dans le bon type, et appèèle la fonction membre sur ce pointeur.
-- Loïc
Ah ok j'ai compris :-) Le problème c'est que ma fonction statique est une WNDPROC de Windows, dans le constructeur de TWindow je donne simplement wndclass.lpfnWndProc WndProc (qui ne marche que si WndProc est un membre statique). A la limite je reçois dans les paramètres le HWND de la fenêtre, c'est tout... Je vais peut-être regarder du côté de WNDCLASSEX ???
Merci pour vos réponses.
Marc.
Marc Lebrun
Je vais peut-être regarder du côté de WNDCLASSEX ???
Ou bien je met le pointeur "this" dans la zone mémoire qu'on peut réserver grâce au cbWndExtra de WNDCLASS. Que je récupère avec GetWindowLong(hWnd ...) dans ma fonction WndProc, ça devrait marcher !!!
Marc.
Je vais peut-être regarder du côté de WNDCLASSEX ???
Ou bien je met le pointeur "this" dans la zone mémoire qu'on peut réserver
grâce au cbWndExtra de WNDCLASS.
Que je récupère avec GetWindowLong(hWnd ...) dans ma fonction WndProc, ça
devrait marcher !!!
Je vais peut-être regarder du côté de WNDCLASSEX ???
Ou bien je met le pointeur "this" dans la zone mémoire qu'on peut réserver grâce au cbWndExtra de WNDCLASS. Que je récupère avec GetWindowLong(hWnd ...) dans ma fonction WndProc, ça devrait marcher !!!