C++ Callback
来源:互联网 发布:ps图片还原算法 编辑:程序博客网 时间:2024/06/05 00:52
C++ Callback
2006/3/26 15:17:02
This fully functional example shows how in C++ callbacks can be done in an absolutely flexible way!
This demo is written in Visual Studio 6 but the Callback class is platform independent and also runs under Linux, Mac, and so forth....
Callbacks in C++ are not as simple as in C. Pure C functions are from the type __cdecl. C++ functions are from the type __thiscall. (They differ in the way how they pass arguments on the stack.)
In C++, you have classes and, additionally, instances of classes. Every instance uses its own memory area for storing class variables. The pointer to this area of variables is the "this" pointer. It represents the instance. Every time you call any C++ function, the "this" pointer is passed to the function as an invisible parameter! (M$ Visual Studio 6 uses the processor register ECX to pass the "this" pointer.)
So, in C++ it is not enough to store the address of the function, which you want to call back. You also have to store the "this" pointer!
Using the Callback Class
You can include "Callback.h" into your project. The usage it is very simple because the cCallback class has only two member functions: SetCallback() and Execute(). You can understand the following examples without knowing what is happening inside cCallback.
cMyProject.h:
#include "callback.h"private: // the functions of your project void CallbackFox (int Param); void CallbackRabbit(int Param); void TestTheCallback(cCallback *pCallbackFunction, int Param); // Some instances of the Callback class TCallback<cMyProject> i_Callback_1; TCallback<cMyProject> i_Callback_2;
cMyProject.cpp:
void cMyProject::CallbackRabbit(int Param){ char Buf[50]; sprintf(Buf, "Now I'm in Rabbit with Param %d !/n", Param); printf(Buf);}void cMyProject::CallbackFox(int Param){ char Buf[50]; sprintf(Buf, "Now I'm in Fox with Param %d !/n", Param); printf(Buf);}void TestTheCallback(cCallback *pCallbackFunction, int Param){ pCallbackFunction->Execute(Param * Param);}void cMyProject::CallbackDemo(){ // defining where the callback should jump to i_Callback_1.SetCallback(this, &cMyProject::CallbackRabbit); i_Callback_2.SetCallback(this, &cMyProject::CallbackFox); // now you can pass i_Callback like a pointer to a function TestTheCallback(&i_Callback_1, 4); TestTheCallback(&i_Callback_2, 5);}
If you call cMyProject::CallbackDemo(), the output will be:
Now I'm in Rabbit with Param 16 !Now I'm in Fox with Param 25 !
Callback Re-Definitions
It is also possible to re-define the callback with SetCallback() as often as you like:
void cMyProject::CallbackDemo(){ i_Callback_1.SetCallback(this, &cMyProject::CallbackRabbit); TestTheCallback(&i_Callback_1, 4); i_Callback_1.SetCallback(this, &cMyProject::CallbackFox); TestTheCallback(&i_Callback_1, 5);}
The output would be the same, but i_Callback_2 is not needed anymore.
Callback Arrays
It is also possible to use arrays of callbacks:
cMyProject.h:
private: TCallback<cMyProject> i_Callback[10];
cMyProject.cpp:
void TestTheCallback(int Index, int Param){ i_Callback[Index].Execute(Param * Param);}void cMyProject::CallbackDemo(){ i_Callback[0].SetCallback(this, &cMyProject::CallbackRabbit); i_Callback[1].SetCallback(this, &cMyProject::CallbackFox); i_Callback[2].SetCallback(.....); TestTheCallback(0, 4); TestTheCallback(1, 5);}
Callback Arrays, Part 2
In the above example, all callbacks are from cMyProject. In i_Callback you can ONLY store callbacks to the cMyProject class because it is defined as TCallback<cMyProject>
.
If you want to store callbacks to different classes in a callback array, you have to create the array from cCallback instead of TCallback:
cMyProject.h:
private: cCallback *p_Callback[10];
cMyProject.cpp:
void cMyProject::StoreCallback(cCallback *p_CallbackFunction, int Index){ p_Callback[Index] = p_CallbackFunction;}
StoreCallback() then can be called by ANY class to set a callback to itself. For example:
cDemo.h:
private: TCallback<cDemo> i_MyCallback;
cDemo.cpp:
#include "cMyProject.h"extern cMyProject i_MyProject;...... i_MyCallback.SetCallback(this, &cDemo::MyCallbackFunction); i_MyProject.StoreCallback(&i_MyCallback, Index);......
You can even later modify i_MyCallback with SetCallback() without having to call StoreCallback() again!!
In the source code (see the download link at the end of this article) you find a different example, and additionally a demonstration of a global callback, which you need, if you want to be called back by the operating system. (Windows API callbacks always go into the global namespace.)
The Callback Class
Finally, here comes the great cCallback class itself. It consits of only a header file without a corresponding cpp file.
Callback.h:
class cCallback{ public: virtual void Execute(int Param) const =0;};template <class cInstance>class TCallback : public cCallback{ public: TCallback() // constructor { pFunction = 0; } typedef void (cInstance::*tFunction)(int Param); virtual void Execute(int Param) const { if (pFunction) (cInst->*pFunction)(Param); else printf("ERROR : the callback function has not been defined !!!!"); } void SetCallback (cInstance *cInstancePointer, tFunction pFunctionPointer) { cInst = cInstancePointer; pFunction = pFunctionPointer; } private: cInstance *cInst; tFunction pFunction;};
This class defines an Execute() function that takes one integer parameter and returns no parameter (void). You can simply adapt it to your needs; for example, a callback that takes five paramaters and returns a bool. (Then, you have to modify three lines: the two lines beginning with "virtual void Execute" and the typedef.)
To completely understand this class, you need advanced C++ knowledge. I will not explain all the details here because this would be too much.
Instead I recommend the very good book:
Author: André Willms
Title: C++ Programming (German title: "C++ Programmierung")
Publisher: Addison Wesley
ISBN 3-8273-1495-X
And from my homepage, you can download free C++ books in the compiled HTML format.
- callback c
- C callback function example
- C#,CallBack实现进度条演示
- CALLBACK函数(转) - C/C++
- c++callback回调实例
- CALLBACK
- callback
- Callback
- CALLBACK
- Callback
- CALLBACK
- CALLBACK
- callBack
- callback
- callback
- callback
- 一个关于CallBack机制的实例(C#)
- CallBack function from Pointers on C
- Mac OS: XAMPP localhost cannot login
- syncml同步类型
- 用汇编与C实现冒泡排序以及一点思考
- 如何: 在ActiveX 控件中获得顶层 IWebBrowser2 接口
- 当您尝试从 TCP 端口大于 5000 连接收到错误 ' WSAENOBUFS (10055) ' 2006/9/2 11:37:34
- C++ Callback
- 更改Delph窗体的默认字体
- Linux Security Shell(原创)
- Linux如何连接终端设备(原创)
- Android2.2 模拟器使用&文件系统提取
- 基于ubuntu 9.04(32位机)的Android2.2 开发环境的搭建
- Radius 认证协议分析
- 程序员:增加编程经验的3种途径
- 孙子兵法与积极人生