pointer to member function



  • Hi:

    class A {
    public:
      A (int x) : my_x(x) {}
    
      float do_something (float f) {
         return my_x + f;
      }
    
    private:
      int my_x;
    };
    
    class B {
    public:
      typedef float (*pt2Func)(float);
    
      B(pt2Func f) {my_f=f;}
    
    private:
      pt2Func my_f;
    };
    
    A a(7);
    
    // Wie jetzt B mit a.do_something Konstruieren?
    

    Kann jemand helfen?

    Danke im vorraus!



  • Funktionszeiger funktionieren nur mit statischen member funktionen



  • Hmmm,

    aber do_something kann ich nicht statisch machen, da es my_x benutzt ... also unmoeglich ein B mit A.do_something zu konstruieren?



  • pointerer schrieb:

    Hmmm,

    aber do_something kann ich nicht statisch machen, da es my_x benutzt ... also unmoeglich ein B mit A.do_something zu konstruieren?

    Du kannst es wrappen:

    struct A
    {
        //...
    
        static static_DoSth(A*,f) { A->do_something(f); }
    };
    
    // ...
    B( &A::static_DoSth );
    

    Du musst halt bei jedem Aufruf dein A pointer haben ...



  • pointerer schrieb:

    aber do_something kann ich nicht statisch machen, da es my_x benutzt ... also unmoeglich ein B mit A.do_something zu konstruieren?

    Kurz erklärt:
    Eine Funktion "void Foo(int)" und eine statische Methode "void Bar::Foo(int)" können mit einen Zeiger angesprochen werden.

    Eine nicht-statische Methode "void Bar::Foo(int)" benötigt aber zudem einen Instanzzeiger (das was du vielleicht als this kennst). Daher reicht ein Zeiger nicht aus.

    cu André



  • Was Funktionszeiger und Memberfunktionszeiger betrifft: Auf http://www.newty.de/fpt/index.html werden diese recht gut erklärt.


Anmelden zum Antworten