klassen funktions pointer
-
hola leute
steh grad tierisch am schlauch.
moechte gerne folgendes machenstruct 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 machenstruct 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 übernimmtwobei ich sowieso nicht verstehe warum da
t.*psteht
-
Meep Meep schrieb:
in der zeile
t.*p("test"); //p("test");kommt der fehler
Ausdruck ergibt keine Funktion, die 1 Argumente übernimmtJa, die Priorität ist beim .*-Operator niedriger, da müssen Klammern drum:
(t.*p)("test");wobei ich sowieso nicht verstehe warum da
t.*psteht
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?