Zeiger zur Function in Klasse speichern und aufrufen



  • Warum das? Die Funktion ist gar nicht static. Schau mal in boost nach, da gibts gute Funktorklassen


  • Mod

    die syntax für pointer to member ist ein bisschen unbequem, insbesondere wenn der pointer to member selbst ein member der klasse ist:

    #include <iostream>
    
    class MeinTest
    {
    public:
        MeinTest() : DieFunktion( &MeinTest::TestFunc ) { };
        ~MeinTest() { };
        void (MeinTest::*DieFunktion)(int a);
    private:
        void TestFunc(int a)
        {
            if (a == 99) std::cout << "yo ok" << std::endl;
        }
    };
    
    int main()
    {
        MeinTest *atest = new MeinTest();
        (atest->*atest->DieFunktion)(99);
        delete atest;
    }
    


  • camper schrieb:

    die syntax für pointer to member ist ein bisschen unbequem, insbesondere wenn der pointer to member selbst ein member der klasse ist:

    #include <iostream>
    
    class MeinTest
    {
    public:
        MeinTest() : DieFunktion( &MeinTest::TestFunc ) { };
        ~MeinTest() { };
        void (MeinTest::*DieFunktion)(int a);
    private:
        void TestFunc(int a)
        {
            if (a == 99) std::cout << "yo ok" << std::endl;
        }
    };
    
    int main()
    {
        MeinTest *atest = new MeinTest();
        (atest->*atest->DieFunktion)(99);
        delete atest;
    }
    

    Kann man damit auch Funktionen aus anderen Klassen aufrufen die (z.B. bei der Windowsprogrammierung) zu anderen Dialogseiten gehören und schoneinmal initialiert wurden?

    Ich stehe nämlich die ganze Zeit vor dem Problem das ich bestimmte wichtige Funktionen aus anderen Klassen (z.B. BaumNeuEinlesen() für das Hauptdialogfenster) immer wieder in andere "aufrufende" Klassen Implementieren und umständlich anpassen muss, um z.B. Buttons von anderen (sichtbaren) Dialogseiten zu steuern.
    Und ich will ja auch nicht für jede Klasse eine globale Zeigervariable anlegen um deren Funktionen aufzurufen (das hat aber den nebeneffekt das eine Funktion vieleicht noch 5 mal in anderen Klassen vorhanden ist).



  • Ich glaub ihr habt das nicht richtig verstanden.

    So wie ich das schon habe, funktioniert es einwandfrei, nur die IDE des Dev-Cpp zeigt mir in der Schreibhilfe zur Ergänzung das nicht an.

    Die Funktionen, welche Aufgerufen werden sollen, werden von der Klasse aufgerufen, aber befinden sich nicht in dieser sondern ausserhalb.

    Mein Ziel ist es, häufig benutzte dinge wie GUI Controls von Windows, in Klassen zu kapseln und bei bestimten ereignissen dafür Funktionen aufzurufen, die ich so zugeordnet habe und sogar in der Laufzeit anders zuordnen kann, diese Funktionen sind in der main.cpp geschrieben. Damit ich später beim Programme schreiben unter verwendung der Klassen nicht immer darinn nachschauen muß, möchte ich gerne das der DevCpp mir das in der Schreibergänzung mit Anzeigt, er zeigt alle Member, aber nicht diesen für die Funktion.
    Daher, wie kann man das noch anders machen, damit diser Member in der Schreibergänzung auftaucht.

    Beim Borland C++ Builder ist es ja ähnlich.



  • Anfänger2005 schrieb:

    Warum das? Die Funktion ist gar nicht static. Schau mal in boost nach, da gibts gute Funktorklassen

    Boost kenne ich nicht und habe ich nicht, wo bekomme ich es und wo steht eine Referenz zu den Funktionen?



  • Anfänger_hier schrieb:

    Boost kenne ich nicht und habe ich nicht, wo bekomme ich es und wo steht eine Referenz zu den Funktionen?

    www.boost.org
    Google, erster Treffer...


  • Mod

    und was haben die funktionen irgendeiner ide bzw. eines editors mit standard c++ zu tun? 😉



  • finix schrieb:

    Anfänger_hier schrieb:

    Boost kenne ich nicht und habe ich nicht, wo bekomme ich es und wo steht eine Referenz zu den Funktionen?

    www.boost.org
    Google, erster Treffer...

    Ich hatte gegoogled, allerdings habe ich versucht die suche zu verfeinern, da ich dachte wenn ich nur boost eingebe, ich alles bekomme von Raketentechnik bis Sportschuhe.

    camper schrieb:

    und was haben die funktionen irgendeiner ide bzw. eines editors mit standard c++ zu tun?

    Nichts, weil es eigentlich auch nicht die Frage ist, es geht mir darum wie man das Standard mässig lösen kann, denn wenn es eine Standard Lösung giebt die jeder Kompiler frisst, dann wird mir der Dev das auch in der Schreibergänzung anzeigen. Die Frage ist schon im richtigen Forum, den es geht nur indirekt um den DevCpp, es geht hier um das abspeichern eines Zeigers zu einer Funktion, die dann entsprechend aufgerufen wird, also Standard C++. 😉



  • Anfänger_hier schrieb:

    finix schrieb:

    Anfänger_hier schrieb:

    Boost kenne ich nicht und habe ich nicht, wo bekomme ich es und wo steht eine Referenz zu den Funktionen?

    www.boost.org
    Google, erster Treffer...

    Ich hatte gegoogled, allerdings habe ich versucht die suche zu verfeinern, da ich dachte wenn ich nur boost eingebe, ich alles bekomme von Raketentechnik bis Sportschuhe.

    So? Diese Suche würde ich echt gern sehen...


  • Mod

    Anfänger_hier schrieb:

    camper schrieb:

    und was haben die funktionen irgendeiner ide bzw. eines editors mit standard c++ zu tun?

    Nichts, weil es eigentlich auch nicht die Frage ist, es geht mir darum wie man das Standard mässig lösen kann, denn wenn es eine Standard Lösung giebt die jeder Kompiler frisst, dann wird mir der Dev das auch in der Schreibergänzung anzeigen. Die Frage ist schon im richtigen Forum, den es geht nur indirekt um den DevCpp, es geht hier um das abspeichern eines Zeigers zu einer Funktion, die dann entsprechend aufgerufen wird, also Standard C++. 😉

    mag sein, aber deine lösung ist ja bereits standardkonform. das der editor nicht intelligent genug ist, aus der benutzung des pointers auf die funktion zu schliessen, ist kein problem der sprache.

    Chris++ schrieb:

    Kann man damit auch Funktionen aus anderen Klassen aufrufen die (z.B. bei der Windowsprogrammierung) zu anderen Dialogseiten gehören und schoneinmal initialiert wurden?

    Ich stehe nämlich die ganze Zeit vor dem Problem das ich bestimmte wichtige Funktionen aus anderen Klassen (z.B. BaumNeuEinlesen() für das Hauptdialogfenster) immer wieder in andere "aufrufende" Klassen Implementieren und umständlich anpassen muss, um z.B. Buttons von anderen (sichtbaren) Dialogseiten zu steuern.
    Und ich will ja auch nicht für jede Klasse eine globale Zeigervariable anlegen um deren Funktionen aufzurufen (das hat aber den nebeneffekt das eine Funktion vieleicht noch 5 mal in anderen Klassen vorhanden ist).

    ich bin nicht sicher, ob ich das problem richtig verstehe. kannst du evtl. mal minimal code posten, um es zu illustrieren?



  • camper schrieb:

    ich bin nicht sicher, ob ich das problem richtig verstehe. kannst du evtl. mal minimal code posten, um es zu illustrieren?

    hm das wird schwierig, weil das weit in die MFC rein geht (und mir da auch keiner helfen kann). Der code ist aber nicht geheim falls du das jetzt denkst.



  • Ich habe es jetzt wie folgt gemacht:

    typedef void (*MFunctionPtr)(int, int, int, int); /* vier int nur Beispiel */
    
    class TestClass {
      public:
        TestClass() { }
        ~TestClass() { }
        MFunctionPtr FunktionEins;
        MFunctionPtr FunktionZwei;
    };
    

    Der Dev zeigt mir nun in der Schreibergänzung:

    ....
    variable  MFunctionPtr FunktionEins
    variable  MFunctionPtr FunktionZwei
    ....
    

    wenn nun ein Ereigniss statt findet, rufe ich die entsprechende Funktion mit

    (*FunktionEins)(1,2,3,4);
    

    auf,
    jetzt habe ich was ich wollte und besser als vorher, danke euch allen.


Anmelden zum Antworten