Als Funktionsparameter eine Instanz einer Klasse !?



  • Hi!

    Ich habe eine Frage und zwar wie kann ich das anstellen das ich einer normalen
    Funktion eine Instanz irgendeiner Klasse übergeben kann damit ich wiederum in der Funktion z.b mit dieser Instanz dort die einzelnen Elementfunktionen der Klasse ansprechen kann ?

    Thx für alle antworten!

    cu



  • du willst eine beliebige Klasse? Das ist schwer möglich, da du selbst wenn du boost::any oder in voller Verzweifelung gar void* benutzt, am Ende doch wieder in ein bestimmtes Objekt zurück Casten musst.

    Wenn es dir darum geht, dass du in einer Funktion bestimmte Funktionen eines Objekts aufrufst, kannst du der Funktion auch einfach Funktoren übergeben. Vielleicht solltest du dir einmal boost::signal angucken.



  • class Foo
    {
    public:
        void bar(char c);
        void klar(char c);
    };
    
    void call_mem_func(Foo & f, void Foo::*member_func_ptr (char))
    {
        (f.*member_func_ptr)('H');
    }
    

    hier gibts noch mehr http://www.function-pointer.org/fpt.html



  • Hi!

    na vielen dank für die Infos und Link. Funktions Pointer sind ja doch etwas
    komplizierter als ich dachte 😉 Werd mich dann mal heude rein arbeiten.

    Hab aber noch eine kleine Frage:

    void call_mem_func(Foo & f, void Foo::*member_func_ptr (char))
    {
        (f.*member_func_ptr)('H');
    }
    

    Ich komme mit dem ersten Parametern nicht ganz klar ..... könnte ich z.b jetzt auch schreiben

    (Foo & G, ......
    

    oder so ? Und meine zweite Frage zu diesem Quellcode-Scnipsel: ist * member_func_ptr() für sich eine Funktion !?
    Woher kommt die ? bzw aus welchem Header und wofür wird diese gebraucht ?

    THX für alle antworten

    cu



  • member_func_ptr ist ein Funktionszeiger auf eine Memberfunktion (daher die etwas ungewohnte Deklarations-Syntax).
    Um Memberfunktionen über Zeiger aufzurufen, gibt es die Operatoren "." und "->", weil diese Funktionen ja ein Objekt brauchen.

    (f.*member_func_ptr)('H');
    

    f ist das Objekt, ".*" der Operator zum Aufrufen der Funktion, auf die member_func_ptr zeigt. ('H') ist der Parameter der Funktion. Die Klammern um (f.*member_func_ptr) sind notwendig, weil der Compiler bei "f.*member_func_ptr('H')" versuchen würde, ('H') mit member_func_ptr in Verbindung zu bringen (was wenig Sinn macht).



  • Hi!

    danke für die schnelle erklährung ! 🙂
    habs jetzt schon einigermaßen verstanden .....

    cu



  • Warum denn nicht so:

    class foo
    {
     void AddChar(char c);
    };
    
    void CallFunction(foo* pFoo)
    {
     pFoo->AddChar('H');
    }
    

    😕



  • Warum sollte man es sich komplizierter machen als nötig? Es gibt nunmal Memberfunktionszeiger, solche work-arounds werden dafür nicht gebraucht.



  • ich habe noch den aufruf vergessen

    class Foo
    {
    public:
        void bar(char c);
        void klar(char c);
    };
    
    void call_mem_func(Foo & f, void Foo::*member_func_ptr (char))
    {
        (f.*member_func_ptr)('H');
    }
    
    int main()
    {
        Foo bla;
        call_men_func(bla, &Foo::klar);
        call_men_func(bla, &Foo::bar);
    }
    


  • Hi

    so ist der Funktionspointer richtig:

    //main.cpp
    
    class Foo 
    { 
    public: 
        void bar(char c); 
        void klar(char c); 
    }; 
    
    void call_mem_func(Foo & f, void (Foo::*member_func_ptr) (char)) 
    { 
        (f.*member_func_ptr)('H'); 
    } 
    
    int main() 
    { 
        Foo bla; 
        call_mem_func(bla, &Foo::klar); 
        call_mem_func(bla, &Foo::bar);
    
    	return 0;
    }
    

    cu



  • zum glück weiss ich nun wofür man so funktionszeiger gebrauchen kann ^^.
    hab ich mich schon immer gefragt 👍


Anmelden zum Antworten