Funktionszeiger erstellen



  • hi

    kann mir jemand please erkläre wie Funktionszeiger aufgebaut sind.
    Auch wie man sie benutzt und die dazu gehörige Erklärung mit der Syntax?
    in meinem buch steht nur ne halbe seite was von Funktionszeigern -.- da steht nicht einmal ein codebeispiel...

    auch war ich schon auf der englishen homepage funcpointers.org oder so kA^^

    mit freundlich grüsen,
    masterofmA*



  • im grunde ganz einfach. du kannst in c++ an jeder beliebigen stelle im code ne methodensignatur deklarieren. nen funktionszeiger nutzt das nun aus, um eine solche signatur auf eine tatsächlich methode zeigen zu lassen.

    int foo(double x, int y) {
    	return 42;
    }
    
    int main() {
    	int (*bar)(double, int); // signatur
    	bar = foo; // auf methode weisen lassen
    	bar(2.0, 0); // wie methode verwenden
    }
    


  • ok danke, ich habs verstanden.



  • Hallo!

    Syntax von Funktionszeigern:

    [Rückgabetyp] (*[Name]) ([Argumente/Typ]);
    

    Beispiel

    // Funktionszeiger:
    // Rückgabtetyp: int
    // Name: MeinFunktionszeiger
    // Parameter/Argumente: Typ int
    int (*MeinFunktionszeiger) (int);
    
    // Normale Funktion
    int Addieren(int add)
    {
        int n = 100;
        return n + add;
    }
    
    // Aufrufen
    
    MeinFunktionszeiger = &Addieren; // Der Funktionszeiger zeigt nun auf Addieren
    
    std::cout << MeinFunktionszeiger(99) << std:endl;
    
    // Ausgabe
    99\n
    

    Hoffe das hilft für den Anfang.



  • Ach, zu langsam.



  • thordk schrieb:

    int foo(double x, int y) {
    	return 42;
    }
    

    Das nennst du eine Methode? Du bist mir so ein Held...



  • Kenner der Scene 2 schrieb:

    thordk schrieb:

    int foo(double x, int y) {
    	return 42;
    }
    

    Das nennst du eine Methode? Du bist mir so ein Held...

    wär dir 23 lieber gewesen?



  • thordk schrieb:

    Kenner der Scene 2 schrieb:

    thordk schrieb:

    int foo(double x, int y) {
    	return 42;
    }
    

    Das nennst du eine Methode? Du bist mir so ein Held...

    wär dir 23 lieber gewesen?

    Ich glaube das bezog sich eher darauf, dass man "Methode" allgemein nur für Funktionen verwendet, die in Klassen definiert sind. Es gibt aber keine wirklich eindeutige Definition.



  • vielleicht sollte man auch anfangen, auf std::tr1::function hinzuweisen.



  • Man erwähne auch für mich komische Sachen wie:

    void dol(int z) { }
    
    void (*func)(int);
    
    //Funktionszeiger auf Funktion zeigen lassen
    func = dol;
    //oder auch
    func = &dol;
    
    //Funktion durch Funktionszeiger aufrufen
    func(5);
    //oder auch
    (*func)(5);
    

    Man sieht es gibt auch immer zwei Möglichkeiten, kann auch noch andere aber geben, bin mir nicht sicher ...



  • Konrad Rudolph schrieb:

    thordk schrieb:

    Kenner der Scene 2 schrieb:

    thordk schrieb:

    int foo(double x, int y) {
    	return 42;
    }
    

    Das nennst du eine Methode? Du bist mir so ein Held...

    wär dir 23 lieber gewesen?

    Ich glaube das bezog sich eher darauf, dass man "Methode" allgemein nur für Funktionen verwendet, die in Klassen definiert sind. Es gibt aber keine wirklich eindeutige Definition.

    nach den mir bekannten definitionen ist methode der allgemeinere begriff. wenn man unterscheiden möchte, dann in funktion und prozedur. wobei das mit klassen nichts zu tun hat. gibt ja nicht ohne grund worte wie "memberfunction" etc. ^^



  • hi

    kann ich auh mit folgender klasse einen funktionszeiger machen?

    class Steuer
    {
    public:
    int get_Miete() { return miete; };
    void set_Miete(int xyz) { miete = xyz; }
    private:
    int miete;
    }
    

    mit freundlichen grüse masterofmA*



  • edit: sry hab das Semikolon hinter der letzten geschweiften klammer vergessen, bitte nicht als Fehler gelten lassen ^^



  • Nein, Funktionszeiger sind nicht kompatibel zu Klassenmethoden (das Problem ist hauptsächlich der this-Zeiger), aber dafür gibt es in C++ Methodenzeiger:

    void (Steuer*::setter)(int) =&Steuer::set_Miete;
    Steuer st;
    (Steuer.*setter)(4711);
    

    (bei der Klammerung bin ich mir nicht zu 100% sicher)



  • CStoll schrieb:

    void (Steuer*::setter)(int) =&Steuer::set_Miete;
    Steuer st;
    (Steuer.*setter)(4711);
    
    void (Steuer*::setter)(int) =&Steuer::set_Miete;
    Steuer st;
    (st.*setter)(4711);
    

    😉



  • KasF schrieb:

    CStoll schrieb:

    void (Steuer*::setter)(int) =&Steuer::set_Miete;
    Steuer st;
    (Steuer.*setter)(4711);
    
    void (Steuer*::setter)(int) =&Steuer::set_Miete;
    Steuer st;
    (st.*setter)(4711);
    

    😉

    void (Steuer::*setter)(int) =&Steuer::set_Miete;
    Steuer st;
    (st.*setter)(4711);
    

    😉



  • 🙂


Anmelden zum Antworten