歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 回調函數在C/C++中的使用

回調函數在C/C++中的使用

日期:2017/3/1 9:20:55   编辑:Linux編程

回調函數就是一個通過函數指針調用的函數。假如把A函數的指針當作參數傳給B函數,然後在B函數中通過A函數傳進來的這個指針調用A函數,那麼就是回調機制。A函數就是回調函數,而通常情況下,A函數是在系統符合你設定的條件下自動執行。

使用回調函數可以改善軟件的結構,提供軟件的復用性。

函數指針是一個指針,只是這個指針不像普通的指針指向一個變量,此時它指向的是一個函數,也就是它存儲的是一個函數的指針。

C++的類成員函數不能像普通函數那樣用於回調,因為每個成員函數都需要有一個對象實例去調用它。通常情況下,要實現成員函數作為回調函數,一種常用的方法就是把該成員函數設計為靜態成員函數。

#include <iostream>

typedef int(*Fun11)(int, int);
typedef float(*Fun12)(float, float);

int min(int a, int b)
{
return a < b ? a : b;;
}

float max(float a, float b)
{
return a > b ? a : b;
}

int test1()
{
Fun11 pFun1 = NULL;
pFun1 = &min;
int ret1 = pFun1(-1, 2);
std::cout<<"min value is: "<<ret1<<std::endl;

Fun12 pFun2 = NULL;
pFun2 = &max;
float ret2 = pFun2(3.4, -2.2);
std::cout<<"max value is: "<<ret2<<std::endl;

return 0;
}

typedef void(*Fun2)(void*);

class CallBack;
class CallBackTest;

class CallBackTest {
public:
CallBackTest() {}
~CallBackTest() {}

void registerProc(Fun2 fptr, void* arg = NULL)
{
m_fptr = fptr;
if (arg != NULL) {
m_arg = arg;
}
}

void doCallBack()
{
m_fptr(m_arg);
}

private:
Fun2 m_fptr;
void* m_arg;
};

class CallBack {
public:
CallBack(CallBackTest* t) : a(2)
{
if (t) {
t->registerProc((Fun2)display, this);
}
}

~CallBack() {}

static void display(void* _this = NULL)
{
if (!_this) {
return;
}

CallBack* pc = (CallBack*)_this;
pc->a++;
std::cout<<"a is "<<pc->a<<std::endl;
}

private:
int a;
};

int test2()
{
//http://www.360doc.com/content/14/0825/13/15077656_404487615.shtml
CallBackTest* cbt = new CallBackTest();
CallBack* cb = new CallBack(cbt);
cbt->doCallBack();

return 0;
}

void callback31()
{
std::cout<<"this a callback function 31"<<std::endl;
}

int callback32(int num)
{
std::cout<<"this input param value is: "<<num<<std::endl;

return 0;
}

void Caller31(void (*ptr)())
{
(*ptr)();
}

void Caller32(int n, int (*ptr)(int))
{
(*ptr)(n);
}

int test3()
{
Caller31(callback31);
Caller32(32, callback32);

return 0;
}


int main()
{
test1();
test2();
test3();

return 0;
}

Copyright © Linux教程網 All Rights Reserved