alternative zu funktionszeiger



  • doktor banane schrieb:

    c++ erlaubt mir aber keine funkionszeiger auf methoden zu machen.

    Wieso nicht? Sie heißen dann Methodenzeiger ...


  • Mod

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