Article View: de.comp.lang.c++
Article #1247Re: Funktionszeiger auf Klassenmethoden
From: Reinhard Pfau
Date: Fri, 12 Jan 1996 11:49
Date: Fri, 12 Jan 1996 11:49
55 lines
3049 bytes
3049 bytes
Karl-Heinz Krause (Krause@t-online.de) wrote: [ DEL: ... ] : Das ist keine Lvsung 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)()); Ach so, darum ging es.. (*Groschen fall*) : Die |bergebene Funktion wird dann vom Betriebssystem bei Eintreten : bestimmter Ereignisse aufgerufen. Sowas kommt bei GUI-Programmierung : hdufig vor, ebenso bei Netzwerkprogrammierung; |berhaupt immer dann, : wenn auf asynchrone Ereignisse reagiert werden soll. Yep. Gerade im Zusammenhang mit Netzwerkprogrammierung hatte ich mal das gleiche Problem. : 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, wdre das einfach: : SyFu (a.method); [ DEL: ... ] : In der Praxis benutzt man dazu folgenden Trick: Man setzt an den Anfang : eines Xmethod-Objekts einige zusdtzliche 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, ndmlich : (fptr.object)->*(fptr.method) : Karl-Heinz Krause Tja, genau diesen Trick habe ich in eine Funktion eingebaut, die mir aus einem Zeiger auf die Objekt-Instanz, einem Zeiger auf die Member- Funktion und einer Parameterbeschreibung dynamisch Maschinencode erzeugt, der den Aufruf der Methode korrekt abwickelt. Diesen Code speicher ich in einer Variablen des Objektes ab (bzw. den Zeiger darauf), so dass jede Instanz ihren eigenen Proxy-Code besitzt. Die Parameterbeschreibung dient dazu, Parameter aus Prozessorregistern C++-konform auf dem Stapel zu legen (, und evtl. wieder zurueckzugeben). Dies ist sehr praktisch, da Systemfunktionen ihre Parameter gerne in Registern uebergeben. Portabel ist das ganze natuerlich nicht mehr. (Meine Version ist fuer PC's ab 386, BC++/TC++, ??DOS.) Reinhard. -- /-- Reinhard Pfau --- (ED-Pfau) --------------------------------------------\ | eMail: gz342@appl2.hrz.uni-siegen.de | IRC: Mubo | no home-page | +----------------------------------------------------------------------------+ | "Keyboard error - press F1 to continue" (PC-BIOS) |
Technical Details
Message-ID:
<4d5hsn$5k8@si-nic.hrz.uni-siegen.de>Path:
arc1-ca.pugleaf.net!appl2.hrz.uni-siegen.de!gz342References:
<48fv1i$paf@sparcserver.lrz-muenchen.de> <1996Jan2.133329.19321@conline.central.de> <4chcqr$vuh@news00.btx.dtag.de> <60KicbrocDB@faerber.muc.de> <4cujoo$vjd@news00.btx.dtag.de>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!appl2.hrz.uni-siegen.de!gz342 From: gz342@appl2.hrz.uni-siegen.de (Reinhard Pfau) Newsgroups: de.comp.lang.c++ Subject: Re: Funktionszeiger auf Klassenmethoden Date: 12 Jan 1996 11:49:43 GMT Organization: HRZ, UNI/GHS Siegen Message-ID: <4d5hsn$5k8@si-nic.hrz.uni-siegen.de> References: <48fv1i$paf@sparcserver.lrz-muenchen.de> <1996Jan2.133329.19321@conline.central.de> <4chcqr$vuh@news00.btx.dtag.de> <60KicbrocDB@faerber.muc.de> <4cujoo$vjd@news00.btx.dtag.de> NNTP-Posting-Host: appl2.hrz.uni-siegen.de X-Newsreader: TIN [version 1.2 PL2]