klassen funktions pointer



  • hola leute

    steh grad tierisch am schlauch.
    moechte gerne folgendes machen

    struct test
    {
       void print(const char *str)
       {
          std::cout << str;
       }
    }
    
    int main(void)
    {
       test t;
       typedef void (test::*print)(const char *str);
       print p = &t.print;
       p("test");
    }
    

    wie funktioniert das richtig ?

    Meep Meep



  • Meep Meep schrieb:

    hola leute

    steh grad tierisch am schlauch.
    moechte gerne folgendes machen

    struct test
    {
       void print(const char *str)
       {
          std::cout << str;
       }
    }
    
    int main(void)
    {
       test t;
       typedef void (test::*print)(const char *str);
       print p = &t.print;
       p("test");
    }
    

    wie funktioniert das richtig ?

    Meep Meep

    struct test
    {
       void print(const char *str)
       {
          std::cout << str;
       }
    }
    
    int main(void)
    {
       test t;
       typedef void (test::*print)(const char *str);
       print p = &test::print; //print p = &t.print;
       t.*p("test"); //p("test");
    }
    


  • in der zeile

    t.*p("test"); //p("test");
    

    kommt der fehler

    Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
    

    wobei ich sowieso nicht verstehe warum da

    t.*p
    

    steht



  • Meep Meep schrieb:

    in der zeile

    t.*p("test"); //p("test");
    

    kommt der fehler

    Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
    

    Ja, die Priorität ist beim .*-Operator niedriger, da müssen Klammern drum:

    (t.*p)("test");
    

    wobei ich sowieso nicht verstehe warum da

    t.*p
    

    steht

    p ist ein Zeiger auf eine (nichtstatische natürlich) Memberfunktion, und Memberfunktionen müssen immer auf einem Objekt (für das this) aufgerufen werden. Deshalb kann es nicht funktionieren, einfach nur p() aufzurufen. Sowas wie "gebundene Methoden" wie z.B. in Python gibt es in C++ nicht. Man kann das allerdings mit Funktionsobjekten nachbauen.



  • Darfst du C++11 verwenden? Mit Lambdas wird das um einiges einfacher. (Alternativ in C++03 boost::function, aber das kommt mit Laufzeiteinbussen.)



  • was und wie wird es mit lambdas einfacher ?



  • Das kommt halt drauf an, was du vorhast.

    Was hasten vor?


Anmelden zum Antworten