adresse einer nicht statischen memberfunktion



  • hola leute

    wie kommt man an die adresse einer nicht statischen memberfunktion?
    geht das ueberhaupt ?

    Meep Meep



  • Ja, das geht - über Methodenzeiger:

    class test
    {
      void do_something(int);
    };
    
    ...
    void (test::function*)(int) = &test::do_something();
    test tester;
    tester.function(4711);
    

    (achtung: ungetestet)



  • Mal schnell korrigieren:

    void (test::function*)(int) = &test::do_something();

    Klammern zuviel, Stern auf der falschen Seite:

    void (test::*function)(int) = &test::do_something;
    

    tester.function(4711);

    Fehlende Derefernzierung und Klammerung:

    (tester.*function)(4711);
    

    Wenn man jetzt do_something noch public macht, sollte das Beispiel funktionieren.



  • hola CStoll

    CStoll schrieb:

    Ja, das geht - über Methodenzeiger:

    class test
    {
      void do_something(int);
    };
    
    ...
    void (test::function*)(int) = &test::do_something();
    test tester;
    tester.function(4711);
    

    (achtung: ungetestet)

    (test::function*)
    

    kann doch schon mal gar net stimmen weil function kein member der class test ist.
    und wie kommst du auf

    tester.function(4711);
    

    ?

    hab folgendes beispiel gemacht:

    class TestClass
    {
       public:
          void my_func(void) { }
          static void static_my_func(void) { }
          void my_func_address(void) 
          { 
    
             std::cout << &TestClass::my_func << std::endl; 
             std::cout << &TestClass::static_my_func << std::endl; 
          }
    };
    
    int main(void)
    {
       TestClass t_class;
       t_class.my_func_address();
       void (TestClass::*function)(void) = &TestClass::my_func;
    
       std::cout << "my_func address: " << function << std::endl;
    
       return 0;
    }
    

    bekomme aber als resultat

    1
    0x00443982
    my_func address: 1
    

    hab also irgendwo nen fehler drinnen oder es geht doch nicht.
    weiß einer mehr ?

    Meep Meep



  • @Hume: Danke für die Korrekturen.

    @Meep: Was hast du denn erwartet? Methodenzeiger gelten nur relativ zu einem Objekt, also wirst du dort keine Vollwert-Zeiger finden.



  • re

    naja mir geht es ja nicht darum das ich mit einem member-funktions-pointer eine member funktion aufrufen kann. ich wollte lediglich die adresse der member funktion rausbekommen.

    Meep Meep



  • Und wozu soll das gut sein?



  • wollte nur was ausprobieren

    Meep Meep


  • Mod

    Es gibt keine Überladung des Operators << für streams und Zeiger auf Memberfunktionen. Allerdings ist ein solcher Zeiger implizit in bool konvertierbar und dafür existiert eine solche Überladung. Die erste Zeile wird daher immer 1 ausgeben. Das hat noch nicht einmal etwas mit dem konkreten Gehalt des Zeigers zu tun, dass das nicht einfach eine Adresse ist und die Frage nach einer solchen Adresse nur in einem bestimmten Kontext sinn haben kann, spielt dabei noch nicht einmal eine Rolle.


Log in to reply