Funktionszeiger auf Klassenmethode(Möglichkeiten?)



  • Hallo,
    ich habe eine kurze Frage zu Pointern auf Klassenmethoden.
    Ich muss an folgende Funktion eine Callback Funktion übergeben.

    void Funktion(void (*func)(void));
    

    Die Funktion ist leider fest und das Problem ist das das ganze Interface für den Nutzer möglichst einfach sein soll.
    Am besten sowas wie hier was natürlich nicht funktioniert.

    void callback()
    {
      //Do something
    }
    
    class Protector
    {
      protected:
        using fncPointer = void (*)();
    
      public:
        explicit Protector(fncPointer callback) : _callback(callback) {}
        fncPointer operator() () {return this->_checker;}
      private:
        void _checker()
        {
          if(secure)
          {
            _callback();
          }
          else
          {
            //doNothing
          }
        }
        fncPointer _callback;
    }
    

    Kann mir da jemand Helfen?


  • Mod

    CraftPlorer schrieb:

    Hallo,
    ich habe eine kurze Frage zu Pointern auf Klassenmethoden.
    Ich muss an folgende Funktion eine Callback Funktion übergeben.

    void Funktion(void (*func)(void));
    

    Wenn Funktion eigentlich alle Funktionsobjekte nehmen sollen könnte, die sich wie void() verhalten, ist der Autor bescheuert kurzsichtig. Das ist Schade.
    Wenn Funktion by design nur Funktionszeiger nimmt, hast du irgendwo in deinem anwendenden Code einen (Design-)Fehler.



  • Arcoth schrieb:

    Wenn Funktion eigentlich alle Funktionsobjekte nehmen sollen könnte, die sich wie void() verhalten, ist der Autor bescheuert. Das ist Schade.

    Kann ich leider nichts dran ist ändern. Ist auch mehr so C mit Klassen auf µC Ebene(Ardruino :()

    Arcoth schrieb:

    Wenn Funktion by design nur Funktionszeiger nimmt, hast du irgendwo in deinem anwendenden Code einen (Design-)Fehler.

    Wenn du mit anwendenden Code den Code meinst den ich gepostet habe ist mir klar das der nicht Funktioniert aber er soll ungefähr sagen was ich erreichen will.
    Um es in Worte zu fassen möchte ich die Callback nur unter einer bestimmten Bedingung Aufrufen welche ich in der Klasse gespeichert habe.



  • Übliches Design von solchen Callbacks ist, dass die noch einen void* Parameter bekommen, damit man beliebige Daten mitgeben kann. Wenn nicht, ist es wirklich sehr kurzsichtig.



  • Mechanics schrieb:

    Übliches Design von solchen Callbacks ist, dass die noch einen void* Parameter bekommen, damit man beliebige Daten mitgeben kann. Wenn nicht, ist es wirklich sehr kurzsichtig.

    Geht es jetzt um den vorgegebenen Funktionsprototype? Sprich:

    void Funktion(void (*func)(void));
    


  • Ja, wobei das dann so ausschauen müsste:

    void Funktion(void (*func)(void*));
    


  • Mechanics schrieb:

    Ja, wobei das dann so ausschauen müsste:

    void Funktion(void (*func)(void*));
    

    Ok. Wie gesagt ist das halt vorgegeben also die Bibliotek besteht schon ich muss halt nur mein Callback übergeben.
    Der Code ist übrigens auch für einen µC geschrieben um genau zu sein ist die Callback eine ISR somit wird kein Parameter in dieser Anwendung benötigt.


Log in to reply