🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #1241

Re: Funktionszeiger auf Klassenmethoden

#1241
From: Karl-Heinz Krause
Date: Tue, 09 Jan 1996 20:38
74 lines
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!Krause
References: <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)