Я пытаюсь создать систему событий с уведомлениями через обратные вызовы.У меня написан код, но он зависит от пустых указателей на работу.После того, как жесткие указатели void укусили меня в моем последнем проекте, я хотел бы заменить указатели void чем-то, что компилирует проверки типов времени.
Вот класс Event
enum EventType {
TEST_TYPE_A,
TEST_TYPE_B
};
// used by event receivers
class EventHandler
{
public:
virtual void handleEvent(EventType type, void* data) = 0; // PROBLEM HERE
};
// class to send events to objects registered for them
class Event
{
private:
std::multimap<EventType, EventHandler*> eventMap;
public:
void registerForEvent(EventType type, EventHandler *handler) {
eventMap.insert(std::pair<EventType, EventHandler*>(type, handler));
}
void sendEvent(EventType type, void* data) { // PROBLEM HERE
std::multimap<EventType, EventHandler*>::iterator it;
std::pair<std::multimap<EventType, EventHandler*>::iterator, std::multimap<EventType, EventHandler*>::iterator> matches;
matches = eventMap.equal_range(type);
for (it = matches.first; it != matches.second; ++it) {
it->second->handleEvent(type, data);
}
}
};
А вот код для тестирования класса Event
class Handler : public EventHandler {
public:
void handleEvent(EventType type, void* data) {
char *cp = (char*)data;
printf("Handler: %s \n", cp);
}
};
int main(int argc, const char* argv[]) {
Handler handle;
Event event;
char c[] = "what?";
event.registerForEvent(TEST_TYPE_A, &handle);
event.sendEvent(TEST_TYPE_A, (void*)c);
return 0;
}
Заранее спасибо за любые указатели!Я застрял на этом.