Ik heb een programma gemaakt maar nu moet er iets tegevoegd wordt: 'events'. Nu is dat niet zo een probleem en zou ik het doen dmv callbacks. Het enigste probleem is het aspect templates + singletons.
Mijn programma bestaat uit een gui (CDialog) en meerdere singletons.
Zo'n singleton:
Een interface hiervoor
en een implementatie:
Nu is het probleem dat ik gebruik maak van een 3rd suplier C library, deze heeft static callbacks naar OnReceive. Nu wil ik van OnReceive een notificatie sturen naar mijn GUI class.
Hoe ik dit wilde realiseren is bij de Resource een pointer naar mijn CDialog gui achterlaten en die aanroepen bij DisplayOnReceive.
Wat ik wilde is bij de Resource class een private member CDialog hebben, een functie RegisterCallback(CDialog* dialog) die de member zet. bij DisplayOnReceive deze member aanspreken, maar dit gaat niet omdat de functie DisplayOnReceive een static is. Ik kan ook niet Resource::Current() doen omdat ik specifieke resources implementaties heb.
Mijn vermoeden is dat ik het ook de na call van DisplayOnRecieve in AResource, BResource de member kan aanspreken via AResource::Current().m_Callback->UpdateComboBox();
Dus dat de registratie in Resource staat:
En de implementatie in AResource
Kan ik op 1 of andere manier er voor zorgen dat de aanroep van UpdateCombox maar 1 keer hoef te typen in de classe Resource, functie DisplayOnReceive dat ik bij elke andere Resource daar niet meer op hoef te letten
/laptekst
Mijn programma bestaat uit een gui (CDialog) en meerdere singletons.
Zo'n singleton:
C++:
1
2
3
4
5
6
7
| template< class C > class Singleton { public: static C& Current(); //etc... } |
Een interface hiervoor
C++:
1
2
3
4
5
6
| template< class resource > class Resource : public Singleton<resource> { protected: static void DisplayOnReceive(); } |
en een implementatie:
C++:
1
2
3
4
5
6
7
8
| class AResource : public Resource<AResource> { static int32_t OnReceive(bladiebla) { DisplayOnReceive(); //bladiebla } } |
Nu is het probleem dat ik gebruik maak van een 3rd suplier C library, deze heeft static callbacks naar OnReceive. Nu wil ik van OnReceive een notificatie sturen naar mijn GUI class.
Hoe ik dit wilde realiseren is bij de Resource een pointer naar mijn CDialog gui achterlaten en die aanroepen bij DisplayOnReceive.
Wat ik wilde is bij de Resource class een private member CDialog hebben, een functie RegisterCallback(CDialog* dialog) die de member zet. bij DisplayOnReceive deze member aanspreken, maar dit gaat niet omdat de functie DisplayOnReceive een static is. Ik kan ook niet Resource::Current() doen omdat ik specifieke resources implementaties heb.
Mijn vermoeden is dat ik het ook de na call van DisplayOnRecieve in AResource, BResource de member kan aanspreken via AResource::Current().m_Callback->UpdateComboBox();
Dus dat de registratie in Resource staat:
C++:
1
2
3
4
5
6
7
8
9
10
| template< class resource > class Resource : public Singleton<resource> { public: void registerCallback(Cdialog* dialog) {m_Callback = dialog); protected: static void DisplayOnReceive(); CDialog* m_Callback; } |
En de implementatie in AResource
C++:
1
2
3
4
5
6
7
8
| class AResource : public Resource<AResource> { static int32_t OnReceive(bladiebla) { DisplayOnReceive(); AResource::Current().m_Callback->UpdateComboBox(); } } |
Kan ik op 1 of andere manier er voor zorgen dat de aanroep van UpdateCombox maar 1 keer hoef te typen in de classe Resource, functie DisplayOnReceive dat ik bij elke andere Resource daar niet meer op hoef te letten
/laptekst
[This space is for rent]