C、C++ 实现回调函数

15 November 2013

1、对于 C 语言
一个及其简单的例子,其实就是利用了函数指针进行调用。

[c]
#include <stdio.h>

void call(int a, int b, void (*callback)(int c)) {
callback(a+b);
}

void call_back(int c) {
printf("%d\n", c);
}

void main(void) {
call(1, 2, call_back);
}

[/c]

2、对于 C++ 语言的静态成员函数
C++ 的静态函数与 C 语言的签名是一样的,所以回调函数的实现也是一样。

3、C++ 语言的非静态函数作为回调函数
由于 C++ 语言类的实现问题,对象的非静态成员函数的引用方式跟 C 函数不同,所以作为回调函数时需要特别的调用方式。简单来说就是把对象的地址传出去,通过地址来间接调用成员函数。
示例:

[cpp]
class ClassA {
/* 真正的回调函数 */
void display(const char *text) { cout << text << endl; }
/* 通过这个静态函数间接调用回调函数,需要传递具体某个对象的指针给它 */
static void wrapper_to_call_display(void ptr2object, char *text) {
ClassA *ptr = (ClassA*)ptr2object;
ptr->display(text);
}
};

/* 此函数使用用户定义的回调函数 */
void call(void *ptr2object,
void (*callback)(void *ptr2object, char *text)) {
callback(ptr2object, "pass this to callback function");
}

/* 创建类 ClassA 的实例,调用 call 触发回调函数 */
void do_it() {
ClassA objA;
/* 把静态函数“注册”到 call 函数。注意,函数名后不跟括号 */
call((void*)&objA, ClassA::wrapper_to_call_display);
}

[/cpp]

2013-11-16-杰良

上一篇: 读《中国哲学简史》—— 原来如此

下一篇: 读《如何写作科幻奇幻小说》