Funktionspointer übergeben, aber welcher Parameter?



  • hallo ich habe eine methode in meiner datenhaltungsklasse, die den paramter einer callbackfunktion bekommen soll.

    in meiner anderen klasse, die diese methode aufrufen soll erstell ich den
    funktionspointer

    //funktionspointer erstellen
    void (CErweiterungSnapShotDlg::*pfunction)(CString strProzess, CString strWert);
    // jetzt zeigt pfunction auf CallbackFunction
    pfunction = &CErweiterungSnapShotDlg::CallbackFunction;

    nun will ich die methode der datenhaltungsklasse aufrufen
    und den funktionspointer übergeben

    mein problem ist, welchen datentyp muss ich denn in die methode reinschreiben für den funktionspointer, es soll allgemein gehalten werden...

    also egal in welcher klasse diese methode aufgerufen wird, es kann immer ein beliebiger funktionspointer mitgegeben werden....

    evtl templates?

    bitte, kann mir jemand helfen?

    __________________



  • Hallo,
    der Funktionszeiger (der hier ein Methodenzeiger ist) alleine reicht nicht. Du musst auch noch ein Objekt übergeben. Eine nicht-statische Methode kann schließlich immer nur relativ zu einem konkreten Objekt aufgerufen werden.
    Wenn du kein Bock auf Objekt hast oder es wirklich ein *Funktions*zeiger sein muss, dann bleibt dir erstmal nichts anderes als eine statische Methode.

    es soll allgemein gehalten werden...

    Wie allgemein? Zumindest die Zahl und die Art der Parameter muss der aufrufenden Funktion bekannt sein. Wie soll sie die entsprechende Methode sonst aufrufen.

    Wenn es der aufrufenden Methode egal sein soll zu welcher Klasse die übergebene Methode gehört, dann reicht ein Membertemplate:

    class Datenklasse
    {
    public:
        template <class Meth, class Obj>
        void callCalback(Meth p, Obj o)
        {
            (o->*p)(2);
        }
    };
    
    class AndereKlasse
    {
    public:
        void meineFunktion(int i)
        {
            cout << "da hat mich wohl jemand zurückgerufen!" << endl;       
        }
        void los(Datenklasse& d)
        {
            void (AndereKlasse::*p)(int) = &AndereKlasse::meineFunktion;
            d.callCalback(p, this);
        }
    };
    class WiederAndereKlasse
    {
    public:
        void tolleFunktion(int i)
        {
            cout << "Ui ui ui" << "i: " << i << endl;       
        }
        void los(Datenklasse& d)
        {
            void (WiederAndereKlasse::*p)(int) = &WiederAndereKlasse::tolleFunktion;
            d.callCalback(p, this);
        }
    };
    
    int main()
    {
        Datenklasse d;
        AndereKlasse a;
        WiederAndereKlasse b;
        a.los(d);
        b.los(d);
    }
    


  • Danke ich hab schon gefunden!


Anmelden zum Antworten