Hey guys. I am working on a callback system of sorts for a UI management class. This is my setup, it seems to work. I am just wondering if you guys have any comments / suggestions on the design. Basically I am trying to hook up events like button clicking and other events, with member functions of a class as them item to callback to.
Think of CCallBackClass as being a UI item(button, label, etc)
Think of CCallBackManager as the dispatcher of events(Clicks, Mouse overs, etc)
Here is sample of the design
Code:
#include <iostream>
#include <vector>
template<class T>
class CCallBackClass
{
public:
CCallBackClass(T *callbackOwner)
{
mOwner = callbackOwner;
}
void(T::*OnCallback)();
void DoCallback()
{
(*mOwner.*OnCallback)();
}
private:
T* mOwner;
};
template <class T>
class CCallBackManager
{
public:
void Add(CCallBackClass<T> *pCallback)
{
mCallbacks.push_back(pCallback);
}
bool Update()
{
//Some random case, where we should call back
//hardcoded for simplicity sack, most likely
//will be a loop going over all the callbacks
//contained and checking conditions to callback
if(rand() % 10 == 3){
mCallbacks[0]->DoCallback();
return false;
}//if
return true;
}
private:
std::vector<CCallBackClass<T> *> mCallbacks;
};
class CNeedsCallback
{
public:
CNeedsCallback()
{
//
//Create the callback for this class
//
mCallback = new CCallBackClass<CNeedsCallback>(this);
mCallback->OnCallback = &CNeedsCallback::CallbackFunction;
//Add it to the callback manager, for keeping the status
mCallbackManager.Add(mCallback);
}
~CNeedsCallback()
{
delete mCallback;
}
void Update()
{
while(mCallbackManager.Update())
{
}
}
void CallbackFunction()
{
std::cout<<"I was called back";
}
CCallBackManager<CNeedsCallback> mCallbackManager;
CCallBackClass<CNeedsCallback> *mCallback;
};
int main()
{
CNeedsCallback myCallbackNeed;
myCallbackNeed.Update();
std::cin.get();
}
Thanks for any input.