alternative zu funktionszeiger
-
hallo
ich habe aktuell etwa so eine situation:
typedef unsigned datatype; struct myclass { datatype const* ptr; // zeiger auf einen datenbereich datatype const& normal_getter(int, int) const; datatype const& special_getter(int, int) const; datatype some_operation(/* ... */, datatype (*getter)(int, int) = &normal_getter) const { // ne menge code } };ich möchte schlussendlich dass ich some_operation mit beiden varianten von gettern aufrufen kann, c++ erlaubt mir aber keine funkionszeiger auf methoden zu machen. wie würdet ihr dieses problem lösen?
gruss
-
Doch, das ist möglich. Mit Memberfunktionszeigern.
http://www.parashift.com/c++-faq/pointers-to-members.htmlIch könnte mir aber vorstellen, dass das Gesamtproblem eventuell eine viel bessere Lösung hat. Was soll hier denn erreicht werden und warum? Beschreib als Antwort auf diese Frage nicht deinen Plan mit den Funktionszeigern! Das wäre das Wie und das geht bestimmt besser.
-
doktor banane schrieb:
c++ erlaubt mir aber keine funkionszeiger auf methoden zu machen.
Wieso nicht? Sie heißen dann Methodenzeiger ...
-
Belli schrieb:
doktor banane schrieb:
c++ erlaubt mir aber keine funkionszeiger auf methoden zu machen.
Wieso nicht? Sie heißen dann Methodenzeiger ...
Und sind keine Funktionszeiger (nicht mal Zeiger). Die Aussage ist schon richtig, nur unvollständig.
-
Warum nicht einfach std::function?
-
das mit den zeigern auf methoden scheint aber nur für statische methoden zu funktionieren.
typedef unsigned datatype; struct myclass { datatype const* ptr; // zeiger auf einen datenbereich datatype const& normal_getter(int, int) const; datatype const& special_getter(int, int) const; datatype some_operation1(datatype (myclass::* getter)(int, int) = &normal_getter) const; //error: ISO C++ forbids taking the address of a bound member function to form a pointer to member function. datatype some_operation2(datatype (myclass::* getter)(int, int) = &(myclass::normal_getter)) const; //error: invalid use of non-static member function ‘const datatype& myclass::normal_getter(int, int) const’ }; int main() { }mein gesamtproblem:
mit meiner klasse habe ich zwei zeiger, die auf speicher auf dem heap zeigen (beide selbe grösse). dabei ist der eine speicher immer eine leicht veränderte version des anderen speichers. welcher speicher gerade der neuste ist, ist auch in der klasse gespeichert. nun möchte ich z.b. mal die funktion some_operation aufrufen. da soll es aber mehrere möglichkeiten geben, z.b. dass man auf die letzte version zugreift, dass man auf eine gespiegelte version zugreift (was ja alles mit verschiedenen gettern gelöst ist), das kriege ich aber nicht hin irgendwie.btw.: ich bin noch nicht so geübt usw. bzgl. c++
-
doktor banane schrieb:
das mit den zeigern auf methoden scheint aber nur für statische methoden zu funktionieren.
→
datatype some_operation1(datatype const& (myclass::* getter)(int, int) const = &myclass::normal_getter) const;Edit:
Das ist aber iwie fragwürdig. Der Benutzer kann/soll keine eigenen getter definieren, da sie Teil der struct sind. Warum dann überhaupt Zeiger auf die vordefinierten, struct-internen Getter übergeben und nicht einfach mehrere Methoden anbieten und die ganzen Details verbergen?
-
lol, ich weiss nicht ob das ein compiler-bug ist aber auf jeden fall habe ich festgestellt, dass die klammern beim default-parameter (wenn man sie um den auflösungsoperator :: setzt, der sowieso stärker bindet als der dereferenzierungsoperator & und somit keinen semantischen unterschied machen dürfte) das verhalten verändern:
ohne klammern, kompiliert einwandfrei:
http://ideone.com/cLOsw7mit klammern, fehler mit den nicht-statischen methoden bla bla:
http://ideone.com/Ta1ZxOan alle, danke für die hilfe (:
-
nachtrag:
mir ist natürlich schon aufgefallen, dass µ in seinem beitrag primär den rückgabetyp des methodenzeigers gefixt hat, jedoch war das in meinem echten projekt stets richtig (da es dort keine referenz ist).
-
datatype some_operation1(datatype const& (myclass::* getter)(int, int) const = &myclass::normal_getter) const;Macht das überhaupt Sinn? Wo issn da der this.
Kanns Methodenzeiger überhaupt Default-Werte geben
-
Kanns Methodenzeiger überhaupt Default-Werte geben
Du kannst ausnahmslos jedem Funktionsparameter, der auch als Funktionsparameter 'funktioniert' (also kompiliert usw.), default-Argumente geben.
-
Jau, aber eben nur statische methoden ... oder?
-
ScottZhang schrieb:
Jau, aber eben nur statische methoden ... oder?
Was genau ist deine Frage?
-
ScottZhang schrieb:
datatype some_operation1(datatype const& (myclass::* getter)(int, int) const = &myclass::normal_getter) const;Macht das überhaupt Sinn? Wo issn da der this.
Du weißt schon, dass man Memberzeigern so einen Wert gibt:
Ret (Class::*ptr) (Args...) = &Class::foo;Und sie so aufruft:
(someObjectOfTypeClass.*ptr)(Arguments...);
-
Also meine Frage ist nach dem Sinn, einem Methodenzeiger default-wert zu geben zu wollen. Denn eine nicht-statische Methode ist an ein Objekt gebunden (this) und das muss ersteinmal existieren.
-
Denn eine nicht-statische Methode ist an ein Objekt gebunden (this) und das muss ersteinmal existieren.
Nein, eine nicht-statische Memberfunktion kann auch ohne Objekt existieren. Sie kann nur nicht ohne Objekt aufgerufen werden (kann man theoretisch, macht man nicht).
-
Nathan schrieb:
ScottZhang schrieb:
datatype some_operation1(datatype const& (myclass::* getter)(int, int) const = &myclass::normal_getter) const;Macht das überhaupt Sinn? Wo issn da der this.
Du weißt schon, dass man Memberzeigern so einen Wert gibt:
Ret (Class::*ptr) (Args...) = &Class::foo;Und sie so aufruft:
(someObjectOfTypeClass.*ptr)(Arguments...);Ok das wusste ich nicht, ich habe die Methodenzeiger noch nie benutzt.
Danke.Edit: Und danke an Sone.
Edit2: Das ne Methode ohne obj existiert war mir schon klar. Mir war nur nicht ganz klar was der Thread Ersteller wollte
