Zeiger auf Member-Funktionen (es geht doch !)



  • Moin,

    Vor kurzem wurde hier mal gefragt, ob man sich Zeiger auf Member-Funktionen einer Klasse geben lassen kann (nicht static) und damit dann die Funktionen aufrufen.

    Darauf hin wurde das von allen veneint (mich eingeschlossen), denn mit der Adresse der Funktion wäre es nicht getan, sie bezieht sich ja auch immer noch auf eine Instanz, also einer Adresse, ab der die Daten gespeichert sind.

    Nun hab ich mir den Sourcecode des Jikes-Java-Compilers angesehen und etwas interessantes gesehen. ES GEHT DOCH ! Natürlich muss man auch die Instanz-Adresse beim Aufruf noch mit angeben. Ich habe daraus mal ein kleines Bsp.-Programm gemach.
    Vielleicht interessiert das ja den einen oder anderen ... 😉

    #include <string>
    #include <iostream>
    
    class X
    {
    private:
      std::string str;
    public:
      X(const std::string &a_str)
      : str(a_str)
      { }
      void test()
      {
        std::cout << str << std::endl;
      }
    };
    
    int main()
    {
      X *a;
      void (X::*ptr)();
    
      ptr = &X::test;
      a = new X(std::string("Hello world."));
      (a->*ptr)();
    
      delete a;
      return 0;
    }
    

    [ 07.07.2001: Beitrag editiert von: class CMarcus ]



  • Nana... das ist bekannt. Schau Dir noch mal die Threads an, wo es darum ging, dort war immer das Problem, daß eben _keine_ Instanz vorhanden war. Wenn Du z.B. einen Member an einen Callback-Handler übergeben mußt, dann kannst Du eben nirgendwo ordentlich Deinen Instanzzeiger parken.

    Zeiger auf Memberfunktionen sind auch bei nicht-statischen Funktionen erlaubt, aber der Klassendeskriptor "klasse::" steckt in dem Zeiger noch mitdrin.

    [ Dieser Beitrag wurde am 24.05.2003 um 23:18 Uhr von Dimah editiert. ]


Anmelden zum Antworten