Problematische static Methode



  • Hi Volks!

    Folgendes Problem:

    Ich hab' eine Klasse und möchte

    #include <iostream>
    #include <vector>
    
    class foo {
    
        public:
    
            typedef void ( *event_handler_fp )( foo *foo_instance );
    
        private:
    
            static std::vector< event_handler_fp > event_handler_map;
            unsigned int num_event_handlers;
    
        public:
    
            foo( ) : num_event_handlers( 0 ) {
            }
    
            void add_event_handler( event_handler_fp event_handler ) {
                event_handler_map.push_back( menu_handler );
                ++num_event_handlers;           
            }
    
            void bar( ) {
                std::cout << "foo::bar( )" << std::endl;
            }
    
            static void event_loop( ) {
                unsigned int event;
                do {
                    event = wait_event( );
                    event_handler_map.at( event )( /* hier */ );
                } while( event );
            }
    };
    

    sinngemäß einen this-Zeiger übergeben, welcher jedoch logischerweise in einer static-Methode nicht existiert, um in den

    void bar_event( foo *foo_instance )  // event-Handlern
    {
        cout << "bar_event( )" << endl;
        foo_instance->bar( );            // foo::bar( )
    }
    

    aufrufen zu können.

    Hat jemand 'ne Idee, wie man soetwas lösen könnte?

    Greetz, Swordfish



  • Ich glaube da kann man was wesentliches nicht lesen... (ein Satz versteckt sich da)



  • Ne, meine Kommentare sind Bestandteil des Satzes:

    Swordfish schrieb:

    Ich hab' eine Klasse und möchte hier sinngemäß einen this-Zeiger übergeben, welcher jedoch logischerweise in einer static-Methode nicht existiert, um in den event-Handlern foo::bar( ) aufrufen zu können.

    Hat jemand 'ne Idee, wie man soetwas lösen könnte?

    Greetz, Swordfish



  • Übergib doch den Zeiger den Du dem Event-Handler übergeben willst auch der Funktion event_loop?



  • @LordJaxtom: Danke, daß du beim Rätseln behilflich bist! So einfach isses aber nicht, da ich die Signatur von event_loop() nicht verändern kann und sie auch nicht selbst aufrufe.

    Hab' mir aber folgendes überlegt:

    #include <iostream>
    #include <vector>
    
    class foo {
    
        public:
    
            typedef void ( *event_handler_fp )( foo *foo_instance );
    
        private:
    // hier >--
            struct event_handler_data {
                foo *foo_instance;
                event_handler_fp event_handler;
            };  
    // --------
    //      static std::vector< event_handler_fp > event_handler_map;
    
    // hier >--
            static std::vector< /* !! */ event_handler_data /* !! */ > event_handler_map;
    // --------
    
            unsigned int num_event_handlers;
    
        public:
    
            foo( ) : num_event_handlers( 0 ) {
            }
    
            void add_event_handler( event_handler_fp event_handler ) {
    // hier >--
                event_handler_data ehd;
                ehd.foo = this;
                ehd.event_handler = event_handler;
                event_handler_map.push_back( ehd );
    // --------
                ++num_event_handlers;          
            }
    
            void bar( ) {
                std::cout << "foo::bar( )" << std::endl;
            }
    
            static void event_loop( ) {
                unsigned int event;
                do {
                    event = wait_event( );
    // hier >--
                    event_handler_map.at( event ).event_handler( 
                        event_handler_map.at( event ).foo
                    );
    // --------
                } while( event );
            }
    };
    

    Fällt jemandem eine elegantere Lösung ein?

    Greetz, Swordfish


Anmelden zum Antworten