Frage zum EventHandler



  • also ich wollte mal ein simplen EventHandler programmieren, also habe ich mir eine EventHandler und eine EventManagerklasse geschrieben.
    Hat auch alles geklappt bis ich versucht habe ein argument mitzu übergeben...

    #ifndef EVENTHANDLER_H
    #define EVENTHANDLER_H
    
    #include "MyList.h"
    
    typedef unsigned int Event;
    
    class EventHandler
    {
    private:
    	Event number;
    	void (*func)(void*);
    public:
    	EventHandler(Event e,void (*ptfunc)(void*))
    		:number(e),func(ptfunc) 
    	{
    	}
    	Event getEvent() {return number;}
    	void OnEvent(void* message) {(*func)(message);}
    };
    
    class EventManager
    {
    private:
    	MyList<EventHandler> list;
    public:
    	bool OnEvent(Event e, void* message = NULL)
    	{
    		for(unsigned int i = 0; i < list.get_size();i++)
    		{
    			if(list[i].getEvent() == e)
    			{
    				list[i].OnEvent(message);
    				return true;
    			}
    		}
    		return false;
    	}
    	void operator+=(EventHandler& eh)
    	{
    		list.push_back(eh);
    	}
    };
    
    #endif
    

    Mein Code funktionniert, aber ich bin nicht zufrieden damit, da es zu kompliziert für den anwender ist wieder in den richtigen typ zurückzuwandeln.

    Ich habe schon versucht das ganze mit templates anstelle von void zeigern hinzukriegen. Wenn ich nur einen einzigen EventHandler einrichte klappt das auch, aber nicht mehr mit dem EventManager, da alle EventHandler einen anderen Übergabewert haben können.

    Gibt es nicht eine bessere möglichkeit den eventhandler zu implementieren?

    ich hoffe ihr versteht was ich meine 🙂



  • es gibt 2 ansaetze - je nachdem was man will.

    1. man verwendet richtige functors statt dummen funktionszeigern und kann so mehr infos zu einer callback speichern, zB kann beim registrieren des callbacks bereits die richtigen daten angegeben werden mit denen das callback ausgefuehrt werden soll.

    2. man verwendet laufzeit polymorphie und eine abstrakte EventArgs klasse. je nach event ist es dann eine konkrete von EventArgs abgeleitete klasse. uU muss in dem callback dann ein downcast gemacht werden auf den konkreten typen - aber dank dynamic_cast ist dass dann ja auch 100% ungefaehrlich.

    void* sollte man in c++ nicht verwenden. sie sind nicht typensicher und das ist boese.

    Ich wuerde dir aber generell raten das komplette design zu aendern. schau dir mal boost::signal und libsigc++ an.



  • ok werde ich mir mal anschauen


Anmelden zum Antworten