.h文件
class CTestCallback
{
public:
void test(int iValue);
typedef std::function<void()> successCallback;
typedef std::function<void(int)> progressCallback;
successCallback onSuccessCallback;
progressCallback onProgressCallback;
};
.cpp文件测试函数
void CTestCallback:test(int iValue)
{
if (onSuccessCallback)
{
onSuccessCallback();
}
if (onProgressCallback)
{
onProgressCallback(iValue);
}
}
为回调成员函数赋值:
class CMyClass
{
public:
void init();
void testSuccessCallback();
void testProgressCallback(int iValue);
CTestCallback _test;
};
为回调成员函数赋值:
void CMyClass:init()
{
_test->onSuccessCallback = bind(&CMyClass::onSuccessCallback,this);
_test->onProgressCallback = CC_CALLBACK_0(CMyClass::onSuccessCallback,this);
}
void CMyClass:testSuccessCallback ()
{
log("success");
}
void CMyClass:testProgressCallback(int iValue)
{
log("progress is %d", iValue);
}
以上是两种为回调成员函数赋值的方法。
以上方法也可以替换为以下的Lambda表达式法:
void CMyClass:init()
{
_test->onSuccessCallback = [=]()
{
log("success");
};
_test->onProgressCallback = [=](int iValue)
{
log("progress is %d", iValue);
};
}
效果是等效的。
注意:
1. 若使用类的成员函数形式,必须在构造函数中初始化为nullptr,否则可能会崩溃。
2. 必须使用if语句判断类成员回调函数是否为空,若为空,跳过调用。若直接对一个空的成员回调函数进行调用,则会崩溃。