Zeiger auf Memberfunktion.



  • Hallo,

    ich möchte eine Klasse schreiben, die eine Callback Funktion zur Verfügung gestellt bekommt. In diesem Beispiel soll A die Möglichkeit bekommen do_sth() aufzurufen, jedoch ohne dafür B kennen zu müssen.
    Kann jemand sagen, ob das geht (ggf. mit Hilfe von boost)?

    Danke.

    typedef void (*cb_func) (void);
    class A
    {
       public:
          set_cb_func( cb_func callback );
    };
    
    class B
    {
       public:
        void do_sth();
    }
    


  • Interfaces könnten da helfen. Ansonsten vielleicht Funktionsobjekte.

    struct CallbackInterface
    {
      virtual void do_sth() = 0;
      virtual ~CallbackInterface(){}
    };
    
    class B : public CallbackInterface
    {
       public:
        void do_sth(){...}
    }
    
    class A
    {
       public:
          set_cb_func( CallbackInterface & callback );
    };
    
    //...
    A a(...);
    B b(...);
    a.set_cb_func(b);
    


  • Danke. So geht es auf jeden Fall.

    Am liebsten wäre mir aber, wenn man einfach einen Zeiger auf die Funktion übergeben könnte. Nur leider verbietet mit der Compiler ja die Adresse einer gebundenen Elementfunktion zu ermitteln um einen Zeiger darauf zu erzeugen. Das würde ich gerne "umgehen".



  • emm schrieb:

    Danke. So geht es auf jeden Fall.

    Am liebsten wäre mir aber, wenn man einfach einen Zeiger auf die Funktion übergeben könnte. Nur leider verbietet mit der Compiler ja die Adresse einer gebundenen Elementfunktion zu ermitteln um einen Zeiger darauf zu erzeugen. Das würde ich gerne "umgehen".

    Wie gesagt, Du könntest es auch mit Funktionsobjekten machen.

    In etwa so:

    typedef std::tr1::function<void (void)> CallbackType;
    
    A::set_cb_func( CallbackType callback );
    
    //...
    
    A a;
    B b;
    
    b.set_cb_func(std::tr1::bind(&B::do_sth, &b));
    


  • Ich nehme an, dass dies dann die Boost-Variante wäre. Danke für die Hilfe.

    typedef boost::function<void (void)> CallbackType;
    
    //...
    A a;
    B b;
    
    a.set_cb_func(boost::bind(&B::do_sth, &b));
    

Log in to reply