 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Andreas Volz Guest
|
Posted: Tue Sep 07, 2004 10:57 am Post subject: Callbacks mit C++ |
|
|
Hi,
da eben meine Frage abgelehnt wurde, versuche ich es jetzt genereller zu
formulieren. Es geht darum einer Klasse eine Funktion zu übergeben und
diese Klasse soll die Funktion dann durch einen Timer oder sonstiges
Event gesteuert aufrufen. Leider klappt es nicht ganz. Das ist die
Klasse:
class DrawboxArea
{
void setDrawCallback ( void (*callbackFunc) (void *dwUser));
void call_callback();
void *dwUser;
void (*callbackFunc) (void *dwUser);
}
void DrawboxArea::setDrawCallback (void (*callbackFunc) (void *dwUser))
{
this->callbackFunc = callbackFunc;
this->dwUser = dwUser;
}
void DrawboxArea::call_callback()
{
(*callbackFunc) (*dwUser);
}
Der Compiler gibt aus:
drawbox.cpp:436: error: `void*' is not a pointer-to-object type
make: *** [drawbox.o] Fehler 1
Irgendwie hab ich das mit den Callbacks noch nicht ganz verstanden. Kann
mir jemand sagen was falsch ist oder mir ein funktionierendes
Callback-Beispiel zeigen?
Gruß
Andreas
--
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 |
|
 |
Florian Weimer Guest
|
Posted: Tue Sep 07, 2004 12:27 pm Post subject: Re: Callbacks mit C++ |
|
|
* Andreas Volz:
| Quote: | void DrawboxArea::call_callback()
{
(*callbackFunc) (*dwUser);
}
Der Compiler gibt aus:
drawbox.cpp:436: error: `void*' is not a pointer-to-object type
make: *** [drawbox.o] Fehler 1
|
Du solltest "dwUser" statt "*dwUser" verwenden.
--
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 |
|
 |
Steffen Rauh Guest
|
Posted: Tue Sep 07, 2004 12:30 pm Post subject: Re: Callbacks mit C++ |
|
|
| Quote: | da eben meine Frage abgelehnt wurde, versuche ich es jetzt genereller zu
formulieren. Es geht darum einer Klasse eine Funktion zu übergeben und
diese Klasse soll die Funktion dann durch einen Timer oder sonstiges
Event gesteuert aufrufen. Leider klappt es nicht ganz. Das ist die
Klasse:
|
Ich gehe mal davon aus, dass du die Funktionen nicht deiner Klasse übergeben
willst, sondern Objekten deiner Klasse.
| Quote: | class DrawboxArea
{
void setDrawCallback ( void (*callbackFunc) (void *dwUser));
|
Wieso kein typedef für den Functionpointer? Die Syntax für Functionpointer
ist nicht gerade leicht lesbar. Dann passieren auch solche Fehler nicht:
typedef void (*CustomCallback)(void*);
void setDrawCallback(CustomCallback CallBack);
| Quote: | void DrawboxArea::setDrawCallback (void (*callbackFunc) (void *dwUser))
{
this->callbackFunc = callbackFunc;
this->dwUser = dwUser;
|
Du übergibst hier die Adresse einer Funktion an deine Methode, aber keine
weiteren Parameter. dwUser gehört zur Deklaration der Funktion und ist kein
Parameter, den du hier auswerten kannst. Mit typedef wäre das nicht
passiert:
void DrawboxArea::setDrawCallback (CustomCallback CallBack)
{
callbackFunc = CallBack;
}
| Quote: | void DrawboxArea::call_callback()
{
(*callbackFunc) (*dwUser);
|
Ein Functionpointer lässt sich wie eine normale Funktion nutzen:
callbackFunc(parameter);
| Quote: | Der Compiler gibt aus:
drawbox.cpp:436: error: `void*' is not a pointer-to-object type
make: *** [drawbox.o] Fehler 1
|
Zeile 436 hab' ich leider in deinem Posting nicht gefunden. Das nächste mal
bitte die Fehlerstelle besser markieren.
| Quote: | Irgendwie hab ich das mit den Callbacks noch nicht ganz verstanden. Kann
|
Dann am besten mal im Stroustrup das Kapitel zu Functionpointern nachlesen.
| Quote: | mir jemand sagen was falsch ist oder mir ein funktionierendes
Callback-Beispiel zeigen?
|
Warum nicht so:
class CallBackHandler
{
public:
virtual void Run() = 0;
};
class MyCallback : public CallBackHandler
{
public:
virtual void Run()
{
// ... implementation
}
};
class Caller
{
CallBackHandler* MyHandler;
public:
void SetCallBack(CallBackHandler* Handler)
{
MyHandler = Handler;
}
void DoCallBack()
{
MyHandler->Run();
}
};
MfG,
Steffen Rauh
--
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 |
|
 |
Falk Tannhäuser Guest
|
Posted: Tue Sep 07, 2004 12:47 pm Post subject: Re: Callbacks mit C++ |
|
|
Andreas Volz wrote:
| Quote: |
class DrawboxArea
{
void setDrawCallback ( void (*callbackFunc) (void *dwUser));
void call_callback();
void *dwUser;
void (*callbackFunc) (void *dwUser);
}
void DrawboxArea::setDrawCallback (void (*callbackFunc) (void *dwUser))
{
this->callbackFunc = callbackFunc;
this->dwUser = dwUser;
|
Erstes Problem: Hier wird this->dwUser an sich selbst zugewiesen, da die
Funktion nur einen Parameter namens 'callbackFunc' hat (welcher die
Membervariable gleichen Namens verdeckt, wenn man nicht 'this->' davor-
schreibt), aber keinen namens 'dwUser'. Das ist wahrscheinlich nicht,
was du wolltest - am besten vermeidet man, die gleichen Namen für
Membervariablen, Funktionsparameter und lokale Variablen zu verwenden!
| Quote: | }
void DrawboxArea::call_callback()
{
(*callbackFunc) (*dwUser);
|
(*callbackFunc) (dwUser);
denn du willst ja sicher einfach den Zeiger übergeben. Einen 'void*'-
Zeiger zu dereferenzieren hat nun mal keinen Sinn.
| Quote: | Der Compiler gibt aus:
drawbox.cpp:436: error: `void*' is not a pointer-to-object type
make: *** [drawbox.o] Fehler 1
Irgendwie hab ich das mit den Callbacks noch nicht ganz verstanden. Kann
mir jemand sagen was falsch ist oder mir ein funktionierendes
Callback-Beispiel zeigen?
|
Weiterhin musst du aufpassen, ob der übergebene Funktionszeiger
auf eine C++-Funktion (frei oder statische Memberfunktion) zeigt,
oder auf eine als 'extern "C"' deklarierte Funktion. Im letzteren
Fall bräuchtest du einen 'typedef':
_______________________________________________
extern "C" typedef void C_callback_func(void*);
class DrawboxArea
{
public:
void setDrawCallback(C_callback_func*, void*);
void call_callback();
private:
void *dwUser;
C_callback_func* callbackFunc;
};
void DrawboxArea::setDrawCallback(C_callback_func* cbf, void* dwu)
{
callbackFunc = cbf;
dwUser = dwu;
}
void DrawboxArea::call_callback()
{
(*callbackFunc) (dwUser);
}
_______________________________________________
MfG
Falk
--
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 |
|
 |
Boris Glawe Guest
|
Posted: Wed Sep 08, 2004 12:57 am Post subject: Re: Callbacks mit C++ |
|
|
wenn du eine Funktion hast, die einen Funktionenpointer übergeben bekommt, dann
sieht das so aus:
func ( void* (*callback)(void *param) );
Der Pointer ist dadurch mit "callback" benannt worden.
Diesen Pointer kannst du benutzen, wie eine Funktion:
func ( void* (*callback)(void *param) ){
callback(param);
}
Grüße boris
--
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 |
|
 |
Boris Glawe Guest
|
Posted: Wed Sep 08, 2004 8:50 am Post subject: Re: Callbacks mit C++ |
|
|
| Quote: | func ( void* (*callback)(void *param) );
Der Pointer ist dadurch mit "callback" benannt worden.
Diesen Pointer kannst du benutzen, wie eine Funktion:
func ( void* (*callback)(void *param) ){
callback(param);
}
Grüße boris
|
Asche über mein Haupt:
Das muss heißen
func ( void (*callback)(void *param) );
[...]
func ( void (*callback)(void *param) ){
callback(param);
}
Die erste Version, also ein Pointer auf eine Methode, die einen void Zeiger
zurückgibt ist auch richtig, aber das war nicht, was ich gemeint habe. Es sollte
einfach nur eine Funktion ohne Rückgabewert und einem Pararmeter sein.
Grüße Boris
--
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 |
|
 |
Alexander Bernauer Guest
|
Posted: Mon Sep 13, 2004 8:02 pm Post subject: Re: Callbacks mit C++ |
|
|
Steffen Rauh <steffen.rauh (AT) gmx (DOT) de> wrote:
| Quote: | class DrawboxArea
{
void setDrawCallback ( void (*callbackFunc) (void *dwUser));
Wieso kein typedef für den Functionpointer? Die Syntax für Functionpointer
ist nicht gerade leicht lesbar. Dann passieren auch solche Fehler nicht:
|
IMHO wäre die beste Lösung, ein Objekt zu übergeben, dessen Klasse die
Callback Funktion deklariert - wenn man schon in C++ und nicht in C
programiert.
Das ist vor allem lesbarer und kostet nix.
mfg
Alex
--
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 |
|
 |
|
|
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
|
|