下面代码展示了c++语言中实现简单回调函数的使用,注:c++新特性采用std::function和std::bind带来了更多的便利。下文的实现方式只是为了和c语言兼容。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <string>
typedef int (*pfnParseData)(const char* pData, int iDataLen);
std::vector<pfnParseData> g_vtCallback;
void addCallbackFunc(pfnParseData pfn)
{
g_vtCallback.emplace_back(pfn);
return;
}
class clsA
{
public:
clsA(std::string strName)
: m_strName(strName)
{
}
int parseData(const char* pData, int iDataLen)
{
std::cout << "this is " << m_strName.c_str() << " output " << pData << std::endl;
printf("0x%x parse data.\r\n", this);
return 0;
}
private:
std::string m_strName;
};
clsA a("object a");
clsA b("object b");
int globalParseDataA(const char* pData, int iDataLen)
{
a.parseData(pData, iDataLen);
return 0;
}
int globalParseDataB(const char* pData, int iDataLen)
{
b.parseData(pData, iDataLen);
return 0;
}
void callbackTest()
{
addCallbackFunc(globalParseDataA);
addCallbackFunc(globalParseDataB);
for (size_t i = 0, iSize = g_vtCallback.size(); i < iSize; ++i)
{
g_vtCallback[i]("infotmation message", 16);
}
return;
}