🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Funktionszeiger auf Klassenmethoden

#1177
From: Karl-Heinz Krause
Date: Thu, 04 Jan 1996 19:20
58 lines
2329 bytes
Am 2. Jan. 1996 schrieb Jens von Pilgrim (jpilgrim@conline.central.de):

> Sedl@lrz.fh-muenchen.de (Andreas Sedlmayr) will Funktionszeiger auf
> Methoden verwenden.
> Dies waere, wenn es funktionieren wuerde toll (z.B. um in GUI-Systemem
> Fenster direkt mit Event-Handler-Methoden zu verbinden). Aber:
> Es KANN NICHT funktionieren: Wo kaeme den bei einem Methodenaufruf
> ueber Zeiger der THIS-Pointer her?????? Und den braucht die Methode
> doch unbedingt

Das ist eine Frage, die regelmäßig kommt. Zunächst einmal gibt es
natürlich Methodenzeiger, die so definiert werden:

	int (X::*mptr)();

die so einen Wert erhalten:

	mptr &X::method;

und die so aufgerufen werden:

	int c (a.*mptr)();

Beim Aufruf der Methode über den Zeiger wird hier das Objekt angegeben.

Das war aber in der Frage vermutlich nicht gemeint. Was man nämlich für
GUI-Programmierung braucht (und auch in anderen Fällen, in denen
Callbacks verwendet werden), sind gebundene Methoden. Das sind
Funktionszeiger, die intern die Information über eine aufzurufende
Methode und das zu benutzende Objekt enthalten. Beispiel:

class X {
    int x;
  public:
    X(int i): x(i) {}
    int method() { return x; }
};

main()
{
    X a(1), b(2);
    int (*fptr)();

    fptr .method;  // geht leider nicht in  C++ !

    int c ptr();   // entspricht einem Aufruf a.method()
}

Sowas haben die Entwickler von C++ leider nicht vorgesehen. Sie waren in
ihrem Denken wohl zu sehr auf konventionelle UNIX-ähnliche Systeme
fixiert und haben einfach beschlossen, daß man sowas nicht braucht. 

Für Callbacks braucht man sowas aber sehr wohl. Darum haben sich
Programmierer Hintertürchen ausgedacht. Leider geht sowas nicht
portabel. Einige Zeilen Assemblercode werden dazu benötigt.


Karl-Heinz Krause
Technical Details
Message-ID: <4chcqr$vuh@news00.btx.dtag.de>
Path: arc1-ca.pugleaf.net!news00.btx.dtag.de!not-for-mail!Krause
References: <48fv1i$paf@sparcserver.lrz-muenchen.de> <1996Jan2.133329.19321@conline.central.de>

Show Full Headers
Complete Article Headers
Newsgroups: de.comp.lang.c++
Message-ID: <4chcqr$vuh@news00.btx.dtag.de>
From: Krause@t-online.de (Karl-Heinz Krause)
Path: arc1-ca.pugleaf.net!news00.btx.dtag.de!not-for-mail!Krause
Subject: Re: Funktionszeiger auf Klassenmethoden
Date: Thu, 04 Jan 1996 19:20:43 +0000
References: <48fv1i$paf@sparcserver.lrz-muenchen.de> <1996Jan2.133329.19321@conline.central.de>
X-Gateway: ZCONNECT XX ius.gun.de [UNIX/Connect v0.73]
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit