2013年12月5日 星期四

把 member function 拿來當作 callback function

這是測試用的, 在實戰中, 請不要這麼用 (除非你有把握完全在你的掌握中, 這其實不容易確定), 在最單純的情形下, member function 其實和一般的 c function 沒什麼不同, 取得 function 位址, 傳入某個 object 位址就和呼叫那個 member function 一樣。

ex:

A a;
a.func()

equal

func(&A);


b.cpp
 1 #include <cstdio>
 2 using namespace std;
 3 
 4 class A
 5 {
 6   public:
 7     A()
 8     {
 9       i_=10;
10     }
11     void inc()
12     {
13       ++i_;
14     }
15     void func1()
16     {
17       printf("i: %d\n", i_);
18     }
19   private:
20     int i_;
21 };
22 
23 typedef void (*CBf)(A *a);
24 
25 int test_cbf(CBf cbf)
26 {
27   A a;
28   (*cbf)(&a);
29   a.inc();
30   (*cbf)(&a);
31 }
32 
33 int main(int argc, char *argv[])
34 {
35   void (A::*p)() = &A::func1;
36   unsigned int addr = *((unsigned int*)&p);
37 
38   test_cbf((void(*)(A*))(addr) );
39 
40   return 0;
41 }

執行結果:
descent@descent-u:tmp$ ./a.out 
i: 10
i: 11

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。