alternative zu funktionszeiger



  • 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/cLOsw7

    mit klammern, fehler mit den nicht-statischen methoden bla bla:
    http://ideone.com/Ta1ZxO

    an 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 🙂


Anmelden zum Antworten