 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Marc Eilhard Guest
|
Posted: Fri Nov 14, 2003 11:01 am Post subject: Callbackfunktionen! |
|
|
Hallo,
dies ist das erste Mal, das ich mich in dieser Newsgroup melde, daher
weiß ich nicht so genau ob ich OT bin mit folgender Frage, wenn ja, dann
entschuldigt!
gibt es irgendeinen Trick mit dem ich doch Funktionszeiger auf
nichtstatische Memberfunktionen erzeugen kann?
Vielen Dank,
Marc Eilhard
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Fri Nov 14, 2003 12:59 pm Post subject: Re: Callbackfunktionen! |
|
|
Marc Eilhard wrote:
| Quote: |
Hallo,
dies ist das erste Mal, das ich mich in dieser Newsgroup melde, daher
weiß ich nicht so genau ob ich OT bin mit folgender Frage, wenn ja, dann
entschuldigt!
gibt es irgendeinen Trick mit dem ich doch Funktionszeiger auf
nichtstatische Memberfunktionen erzeugen kann?
|
Funktionszeiger auf nichtstatische Memberfunktionen sind kein
Problem.
Das Problem das Du wahrscheinlich hast, ist so einen Funktionszeiger
an eine andere Funktion zu uebergeben, die einen normalen Funktions-
zeiger erwartet. Das geht so nicht. Funktionszeiger auf Memberfunktionen
sind mit normalen Funktionszeigern nicht kompatibel. Warum das? Ganz
einfach: Auch wenn Du einen Zeiger auf die Funktion hast, brauchst
Du immer noch das Objekt, ueber das der Funktionsaufruf gemacht
werden soll. Und das hast Du nicht, wenn Du nur den Funktionszeiger
hast.
Viele Interfaces die einen Funktionszeiger annehmen, erlauben zusaetzlich
noch die Uebergabe eines zusaetzlichen Parameters, der so wie er ist
an die Callbackfunktion uebergeben wird. Meist ist dieser Parameter
ein void*, ein int oder long oder etwas gleichwertiges. Dies ist deine
Eintrittskarte um vom Callback wieder auf das Objekt zu gelangen.
Du uebergibst einen Pointer auf das Callback-Objekt in diesem Parameter
und einen Funktionszeiger auf eine normale freistehende Funktion. Die
freistehende Funktion casts sich dann diesen uebergebenen Wert wieder
zurecht und ruft die Memberfunktion des Objekts auf.
Geht dies nicht, dann bleibt Dir nur:
Objektpointer in eine globale Variable stellen, C Callbackfunktion
als Callback anmelden. Innerhalb der Callbackfunktion auf die globale
Variable zugreifen und darueber den Aufruf der Memberfunktion abwickeln.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Olaf Krzikalla Guest
|
Posted: Fri Nov 14, 2003 1:16 pm Post subject: Re: Callbackfunktionen! |
|
|
Hi,
Andreas Nicolai wrote:
| Quote: | Daran knobel ich auch schon die ganze Zeit, mein Compiler verwehrt mir
aber den erwünschten Erfolg:
Test-Program:
-----------
#include
using namespace std;
class Foo {
public:
typedef double (Foo::*MemberFunc)(double);
MemberFunc f;
double test(double pc) { return fact*pc; }
double fact;
};
int main() {
Foo foo, foo2;
foo.f = &Foo::test; // scheint erstmal zu gehen
foo.fact = 2.2;
foo2.f = &Foo::test;
foo2.fact = 3.3;
cout << foo.f(2) << endl; // ARGH!!! "Aufruf einer
Nicht-Funktion"
cout << foo2.f(2) << endl;
};
-----------
Bekommt das einer zum Laufen?
|
foo.f ist ein Zeiger auf eine Memeberfunktion. Diese muß mit einer
Instanz der entsprechenden Klasse (hier auch Foo) aufgerufen werden.
Also z.B.
foo.*foo.f (2); //bin mir hier unsicher, evtl. auch foo.(*foo.f) (2)
aber auch z.B.
foo.*foo2.f (2); //ruft das in foo2 gesetzte f für foo auf
etc.
Hth
Olaf Krzikalla
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Fri Nov 14, 2003 1:23 pm Post subject: Re: Callbackfunktionen! |
|
|
Hallo,
Andreas Nicolai <Andreas.Nicolai (AT) web (DOT) de> wrote:
| Quote: | class Foo {
public:
typedef double (Foo::*MemberFunc)(double);
MemberFunc f;
[...]
cout << foo.f(2) << endl; // ARGH!!! "Aufruf einer Nicht-Funktion"
|
(foo.*foo.f)(2);
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Fri Nov 14, 2003 6:16 pm Post subject: Re: Callbackfunktionen! |
|
|
Marc Eilhard <marc.eilhard (AT) forst (DOT) uni-goettingen.de> writes:
| Quote: | gibt es irgendeinen Trick mit dem ich doch Funktionszeiger auf
nichtstatische Memberfunktionen erzeugen kann?
|
Nein (wie schon geschrieben wurde). Es gibt aber schon möglichkeiten, Member-
und Nichtmemberfunktionen homogen zu verwenden. Schau Dir mal die function-
Bibliothek von Boost (http://www.boost.org/) an.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Daniel Albuschat Guest
|
Posted: Fri Nov 14, 2003 6:51 pm Post subject: Re: Callbackfunktionen! |
|
|
Thomas Maeder wrote:
| Quote: | Marc Eilhard <marc.eilhard (AT) forst (DOT) uni-goettingen.de> writes:
gibt es irgendeinen Trick mit dem ich doch Funktionszeiger auf
nichtstatische Memberfunktionen erzeugen kann?
Nein (wie schon geschrieben wurde). Es gibt aber schon möglichkeiten, Member-
und Nichtmemberfunktionen homogen zu verwenden. Schau Dir mal die function-
Bibliothek von Boost (http://www.boost.org/) an.
|
Dafuer braucht man garkein Boost. std::mem_fun tut's da auch schon.
Daniel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andreas Nicolai Guest
|
Posted: Fri Nov 14, 2003 8:45 pm Post subject: Re: Callbackfunktionen! |
|
|
Hi Marc!
Daran knobel ich auch schon die ganze Zeit, mein Compiler verwehrt mir
aber den erwünschten Erfolg:
Test-Program:
-----------
#include <iostream>
using namespace std;
class Foo {
public:
typedef double (Foo::*MemberFunc)(double);
MemberFunc f;
double test(double pc) { return fact*pc; }
double fact;
};
int main() {
Foo foo, foo2;
foo.f = &Foo::test; // scheint erstmal zu gehen
foo.fact = 2.2;
foo2.f = &Foo::test;
foo2.fact = 3.3;
cout << foo.f(2) << endl; // ARGH!!! "Aufruf einer
Nicht-Funktion"
cout << foo2.f(2) << endl;
};
-----------
Bekommt das einer zum Laufen?
Andreas (knobelnd)
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Horst Kraemer Guest
|
Posted: Fri Nov 14, 2003 9:43 pm Post subject: Re: Callbackfunktionen! |
|
|
On Fri, 14 Nov 2003 12:45:00 -0800, Andreas Nicolai
<Andreas.Nicolai (AT) web (DOT) de> wrote:
| Quote: | Hi Marc!
Daran knobel ich auch schon die ganze Zeit, mein Compiler verwehrt mir
aber den erwünschten Erfolg:
Test-Program:
-----------
#include
using namespace std;
class Foo {
public:
typedef double (Foo::*MemberFunc)(double);
MemberFunc f;
double test(double pc) { return fact*pc; }
double fact;
};
int main() {
Foo foo, foo2;
foo.f = &Foo::test; // scheint erstmal zu gehen
foo.fact = 2.2;
foo2.f = &Foo::test;
foo2.fact = 3.3;
cout << foo.f(2) << endl; // ARGH!!! "Aufruf einer
Nicht-Funktion"
|
Zuerst einmal muessen Memberfunktionszeiger mit dem Operator .*
aufgerufen werden. Zum zweiten, musst Du angeben, welchen Zeiger Du
moechtest. Wenn Du ausserhalb der Klasse bist, in der der Zeiger
definiert ist, musst Du ihn mit foo.f explizit angeben.
cout << (foo.*foo.f)(2) << endl;
MfG
Horst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Stefan Ring Guest
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|