Funktionszeiger in Klassen



  • Hallo,

    ich habe eine Klasse "Panel" geschrieben, die auf Mausklicks reagiert. Die Reaktion besteht darin, das ein Funktionszeiger aufgerufen wird. Das sieht dann so aus:

    typedef void (*event_function)(void);
    
    class Panel {
      //...
    protected:
      event_function OnClick;
    public:
      process_events(SDL_Event* event);
      set_OnClickEvent(event_function ef);   
      //...
    };
    
    Panel::process_events(SDL_Event* event) {
      //...
      this->OnClick();
    }
    

    Das Problem besteht nun darin, dass ich in einer anderen Klasse nur static-Funktionen zuweisen kann:

    class main_menue: public Panel {
    public:
      main_menue()
      {
        this->set_OnClickEvent((SDL::Interface::event_function)OnClick_Quit);
      }
    protected:
      static void OnClick_Quit(void);
    };
    

    Lasse ich das "static" weg kommt folgende Fehlermeldung:
    "error C2440: 'Typumwandlung': 'overloaded-function' kann nicht in 'SDL::Interface::event_function' konvertiert werden"

    Ich will aber auf die Elemente von main_menue zugreifen können. Wie stelle ich das an?



  • Klassenmethoden werden in C++ anders behandelt and normale Funktionen. Ein Methodenzeiger sieht so aus:

    struct MyClass
    {
       void tuewas(){
          cout << "MyClass::tuewas()\n";
       }
    };
    
    int main()
    {
      // Methoden-Typ nimmt nur Funktionen von MyClass an. 
      // Mit entsprechender Signatur natürlich
      typedef void (MyClass::*Func)(); 
    
      MyClass obj;
      Func func = &MyClass::Func; // Hier die Zuweisung
    
      (obj.*func)(); // hier der Aufruf
      ...
    }
    

    Erstelle aber besser einen eigenen Funktor. Dieser Kapselt dann Funktionszeiger und Methodenzeiger.


Anmelden zum Antworten