Article View: de.comp.lang.c++
Article #1241Re: Funktionszeiger auf Klassenmethoden
From: Karl-Heinz Krause
Date: Tue, 09 Jan 1996 20:38
Date: Tue, 09 Jan 1996 20:38
74 lines
2948 bytes
2948 bytes
Am 6. Jan. 1996 schrieb Claus Faerber (claus@faerber.muc.de):
> Karl-Heinz Krause <Krause@t-online.de> schrieb zu
> Re: Funktionszeiger auf Klassenmethoden
> >
> > class X {
> > int x;
> > public:
> > X(int i): x(i) {}
> > int method() { return x; }
> > };
> >
> > main()
> > {
> > X a(1), b(2);
> > int (*fptr)();
> >
> > fptr = a.method; // geht leider nicht in C++ !
> >
> > int c = fptr(); // entspricht einem Aufruf a.method()
> > }
>
> Was ist damit:?
> // class X wie oben
> struct Xmethod {
> X* object;
> int (X::*method)();
> }
> main()
> {
> X a(1), b(2);
> Xmethod fptr = { a, &X::method };
> //...
> int c = (fptr.object)->*(fptr.method) ();
> }
Das ist keine Lösung des Problems. Sicher, hier in diesem Beispiel
funktioniert es. Es ging mir aber vor allem um folgenden Fall: Gegeben
sei eine Systemfunktion SyFu, die als Parameter einen Funktionszeiger
erwartet.
void SyFu (int(*fptr)());
Die übergebene Funktion wird dann vom Betriebssystem bei Eintreten
bestimmter Ereignisse aufgerufen. Sowas kommt bei GUI-Programmierung
häufig vor, ebenso bei Netzwerkprogrammierung; überhaupt immer dann,
wenn auf asynchrone Ereignisse reagiert werden soll.
Ich will jetzt an SyFu eine Funktion übergeben, die die Methode "method"
für das bestimmte X-Objekt "a" aufruft. Wenn gebundene Methoden
existieren würden, wäre das einfach:
SyFu (a.method);
Aber das geht in C++ nicht. Xmethod kann ich natürlich auch nicht
benutzen, denn SyFu erwartet einen Funktionszeiger und kein
Xmethod-Objekt. Was man also braucht ist sowas ähnliches wie ein
Xmethod-Objekt, das sich aber auch wie eine Funktion verhält.
In der Praxis benutzt man dazu folgenden Trick: Man setzt an den Anfang
eines Xmethod-Objekts einige zusätzliche Bytes, die im wesentlichen die
Maschinencodes für einen Funktionsaufruf enthalten. Dadurch wird
erreicht, daß die Adresse eines Xmethod-Objekts auch als Adresse einer
Funktion betrachtet werden kann, die beim Aufruf gerade das Gewünschte
macht, nämlich
(fptr.object)->*(fptr.method)
Karl-Heinz Krause
Technical Details
Message-ID:
<4cujoo$vjd@news00.btx.dtag.de>Path:
arc1-ca.pugleaf.net!news00.btx.dtag.de!KrauseReferences:
<48fv1i$paf@sparcserver.lrz-muenchen.de> <1996Jan2.133329.19321@conline.central.de> <4chcqr$vuh@news00.btx.dtag.de> <60KicbrocDB@faerber.muc.de>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news00.btx.dtag.de!Krause From: Krause@t-online.de (Karl-Heinz Krause) Newsgroups: de.comp.lang.c++ Subject: Re: Funktionszeiger auf Klassenmethoden Date: 9 Jan 96 20:38:48 GMT Message-ID: <4cujoo$vjd@news00.btx.dtag.de> References: <48fv1i$paf@sparcserver.lrz-muenchen.de> <1996Jan2.133329.19321@conline.central.de> <4chcqr$vuh@news00.btx.dtag.de> <60KicbrocDB@faerber.muc.de> Organization: Telekom Online Internet Gateway X-Gateway: ZCONNECT UH link-gl.dinoco.de [UUCPfZ V5.68 U031], RFC1036/822 UH link-gl.dinoco.de [UUCPfZ V5.68 U031] MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Newsreader: Forte Free Agent 1.0.82 X-Sender: 0913148778-0001@t-online.de (Karl-Heinz Krause)