C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Callbackfunktionen!

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Marc Eilhard
Guest





PostPosted: Fri Nov 14, 2003 11:01 am    Post subject: Callbackfunktionen! Reply with 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?


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





PostPosted: Fri Nov 14, 2003 12:59 pm    Post subject: Re: Callbackfunktionen! Reply with quote





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





PostPosted: Fri Nov 14, 2003 1:16 pm    Post subject: Re: Callbackfunktionen! Reply with quote



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





PostPosted: Fri Nov 14, 2003 1:23 pm    Post subject: Re: Callbackfunktionen! Reply with quote

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





PostPosted: Fri Nov 14, 2003 6:16 pm    Post subject: Re: Callbackfunktionen! Reply with quote

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





PostPosted: Fri Nov 14, 2003 6:51 pm    Post subject: Re: Callbackfunktionen! Reply with quote

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





PostPosted: Fri Nov 14, 2003 8:45 pm    Post subject: Re: Callbackfunktionen! Reply with quote

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





PostPosted: Fri Nov 14, 2003 9:43 pm    Post subject: Re: Callbackfunktionen! Reply with quote

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





PostPosted: Sat Nov 15, 2003 12:31 pm    Post subject: Re: Callbackfunktionen! Reply with quote

Das könnte auch nützlich sein:

http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&selm=t7ecntsujrska2%40news.supernews.com&rnum=5

--
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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.