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 

Callbacks mit C++

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





PostPosted: Tue Sep 07, 2004 10:57 am    Post subject: Callbacks mit C++ Reply with quote



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





PostPosted: Tue Sep 07, 2004 12:27 pm    Post subject: Re: Callbacks mit C++ Reply with quote



* 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





PostPosted: Tue Sep 07, 2004 12:30 pm    Post subject: Re: Callbacks mit C++ Reply with quote



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





PostPosted: Tue Sep 07, 2004 12:47 pm    Post subject: Re: Callbacks mit C++ Reply with quote

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





PostPosted: Wed Sep 08, 2004 12:57 am    Post subject: Re: Callbacks mit C++ Reply with quote

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





PostPosted: Wed Sep 08, 2004 8:50 am    Post subject: Re: Callbacks mit C++ Reply with quote


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





PostPosted: Mon Sep 13, 2004 8:02 pm    Post subject: Re: Callbacks mit C++ Reply with quote

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
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.