Funktionspointer auf Memberfunktion einer anderen Klasse



  • Hallo Zusammen,

    Habe ein Problem mit einem Funktionspointer und hoffe Ihr könnt mir helfen. Ich habe eine Klasse in der ein Funktionspointer deklariert ist. Jetzt möchte ich in einer anderen Klasse eine Instanz der ersten Klasse erzeugen und dann den Funktiospointer auf eine Funktion der zweiten klasse zeigen lassen um dann diese funktion aus der ersten klasse aufrufen zu können.

    Beispiel ...

    typedef void(*TMeineFunktion)(int); 
    
    class Klasse_1 
    { 
        public : 
            void XYZ(); 
            TMeineFunktion Fkt;      
    }; 
    void Klasse_1::XYZ() 
    { 
        // Funktion ausführen auf die der Funktionspointer zeigt... 
        if(this->Fkt!=NULL) 
            this->Fkt(1); 
    } 
    
    class Klasse_2 
    { 
        public : 
            Klasse_2(); 
            Klasse_1* ObjektVonKlasse1; 
            void FunktionA(int); 
    }; 
    Klasse_2::Klasse_2() 
    {    
        // Objekt von Klasse 1 erzeugen 
        this->ObjektVonKlasse1 = new Klasse_1();      
        // Funktionspointer von Klasse 1 auf Funktion aus Klasse 2 legen 
        this->ObjektVonKlasse1->Fkt=this->FunktionA; 
    } 
    void Klasse_2::FunktionAA(int); 
    { 
        // mach irgend was 
    }
    

    Das Problem liegt laut Compilerfehler daran dass ich auf den Funktionspointer der Fremdklasse keine eigene Memberfunktion abbilden kann. Wenn ich das Klasse2 Objekt und die Funktion außerhalb einer Klasse deklariere dann gehts. Aber irgend wie muss das doch gehen, Borlands VCL kanns doch auch 🙂 ....

    Wär nett wenn mir jemand einen Tip geben könnte...

    Gruß Praxmaster



  • Schau mal in die FAQ, da steht was zu Methodenzeigern...



  • Hallo,

    Um diesen Code-Snippet compilieren zu können, muss dein typedef folgendermaßen aussehen:

    typedef void(Klasse_2::*TMeine_Funktion)(int);
    

    Desweiteren muss die folgende Zeile:

    this->ObjektVonKlasse1->Fkt=this->FunktionA;
    

    durch

    this->ObjektVonKlasse1->Fkt=this->&Klasse_2::FunktionA;
    

    ersetzt werden.

    Allerdings finde ich dein Design ziemlich strange...

    /edit: Sorry, habe mir deinen Code jetzt erst genauer angeschaut. Ich glaube du solltest dir Methoden-Zeiger nochmal anschauen. Diese sind nämlich an ein *objekt* gebunden, weshalb unter anderem die folgende Zeile

    this->Fkt(1);
    

    so nicht kompilieren wird....

    so long

    Caipi



  • Danke für Eure schnellen Antworten,

    Habe gerade die FAQs und Dein Beispiel gelesen. Das Problem ist, dass ich das Typedef so nicht umbauen kann. weil ich die Klasse1 von der Klasse 2 unabhänig lassen möchte, oder ich steh bei Deinem Beispiel auf dem Schlauch. Wenn ich wie gesagt in der main mein objekt instanziere und die funktion nicht member irgend einer klasse ist kann ich die memberfunktion der klasse1 umbiegen..

    Hintergrund ist. ich hab mir eine Klasse gebaut die mir mit CreateWindowEx Edit Controls erzeugt, da die Borland VCL Edits kein UniCode können. die Funktionspointer sollen jetzt von den Funktionen meiner Editdie die ich für die div. Windowsnachrichten erstellt habe aufgerufen wenn sie vorher durch die aufrufende Klasse belegt worden sind. Wenn man also meint dem edit noch irgend was im WM_KEYUP oder sonst wo mitgeben zu wollen dann soll man eine Funktion auf die "KeyUpUserProc" legen können die dann von meinem Edit Control aufgerufen wird.

    Ich könnte das Typedef jetzt so umbauen

    typedef void (MeinEdit::*TMeineUserProc)(int);
    

    aber das hilft glaub ich dann nicht weiter oder ,.... es müsste doch aber gehen, dass man an die addresse der memberfunktion des edits die addresse der anwender funktion schreibt...



  • das this->Fkt(1); in Klasse1 lies sich compilieren und auch ausführen, solange eben die Funktion auf die Fkt zeigt nicht in einer klasse ist...



  • [quote="phlox81"]Schau mal in die FAQ, da steht was zu Methodenzeigern...[/quote]

    was sind das denn für Antworten?



  • [quote="Caipi"]Hallo,

    Um diesen Code-Snippet compilieren zu können, muss dein typedef folgendermaßen aussehen:

    typedef void(Klasse_2::*TMeine_Funktion)(int);
    

    Desweiteren muss die folgende Zeile:

    this->ObjektVonKlasse1->Fkt=this->FunktionA;
    

    durch

    this->ObjektVonKlasse1->Fkt=this->&Klasse_2::FunktionA;
    

    ersetzt werden.

    Allerdings finde ich dein Design ziemlich strange...

    stimmt,hab zwar noch nicht viel gesehen aber das ist echt strange wie der da dreimal um die Ecke erbt...

    /edit: Sorry, habe mir deinen Code jetzt erst genauer angeschaut. Ich glaube du solltest dir Methoden-Zeiger nochmal anschauen. Diese sind nämlich an ein *objekt* gebunden, weshalb unter anderem die folgende Zeile

    this->Fkt(1);
    

    so nicht kompilieren wird....

    so long

    Caipi[/quote]



  • Ich erb doch gar nix 😉 und sooo strange ist das jetzt auch wieder nicht, ich will einfach ne funktion aufrufen die von ner anderen klasse festgelegt wird.... 😮


Anmelden zum Antworten