bonjour j'aimerais que kkun puisse me repondre...
pour me familiariser avec le C++ je passe actuellement mon temps a faire un wrapper win32
je voudrais avoir une classe MyApp qui contient un pointeur vers un MyWindow et que MyApp recoivent les evenements générés par MyWindow
j'ai essayé avec sigc++ mais la librairie ne fonctionne pas en ce moment - probleme de compilation. j'aimerais pouvoir l'eviter, d'autant plus qu'elle fait bien dans les 2mb de taille.
j'ai aussi trouvé sigslot qui tient dans seulement 4ko mais qui ne correspond apparament pas bien a mon besoin (assertion failed dans OnTerminate).....
le besoin en question c'est d'avoir un evenement OnTerminate qui correspond au message WM_NCDESTROY
une fois que MyApp recoit OnTerminate, il ne lui reste alors qu'a supprimer le pointeur vers MyWindow (delete + mise à NULL) comme ça le conteneur de l'objet est informé, la recupération (destruction des objets) de la memoire se fait de maniere efficace et claire.
d'ailleurs je me permet de poser une question subsidiaire en passant... est ce que l'instruction "delete MyWindow" au sein de l'evenement Myapp->MyWindow_OnTerminate n'est pas une violation des principes ? En effet, à la sortie de OnTerminate on retourne dans un objet qui vient d'être détruit. de la même manière on pourrait peut être dire la même chose pour "delete this" qui va généralement produire un return depuis un objet qui vient aussi d'être détruit.
j'en vient aux détails techniques et au problème proprement dit...
La question est comment supprimer la référence à MyApp ci dessous dans la class Event. Je voudrais avoir une classe générique capable d'accepter un pointeur sur MyApp mais aussi sur n'importe quelle autre instance de classe. à chaque variation que je tente, le compilo me dit qu'il faut préciser une classe
j'ai essayé différents style mais autant il semble simple de gérer le cas des pointeurs vers les fonctions globales, autant il semble complexe de faire de même avec les fonctions membres.
j'espère avoir été clair Merci à ceux qui pourront répondre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 class Event { public: MyApp* m_PtrClassinstance; void (MyApp::*m_PtrFunctionAddress)(); //ce style n'est pas autorisé :( //void* m_PtrClassinstance; //void (*m_PtrFunctionAddress)(); void Operator()() { (m_PtrClassinstance->*m_PtrFunctionAddress)(); } } class MyWindow { public: Event* OnClick; ... WndProc() { case WM_MOUSEUP: OnClick(); // declenche l'evenement } }
Partager