读书人

用种写回调函数

发布时间: 2012-09-18 16:21:42 作者: rapoo

用类写回调函数
想自己写一个回调函数练练手,结果各种问题各种看不懂,求各位大神指点指点!!!
以下是程序的主要代码:【请大神耐心看看,其实就只有一个函数有操作而已。。十分简单】

typedef void (*callbackFunction)();
typedef int aaa;
class CallbackTest
{
public:
CallbackTest(){}
virtual ~CallbackTest(){}
static void myCallback(void (*callbackFuction)())
{
cout << "myCallback!!" << endl;
}
};

class SetCallback
{
public:
SetCallback(){}
virtual ~SetCallback(){}
void doMyCallback()
{
cout << "doMyCallback!!"<< endl;
CallbackTest::myCallback(&SetCallback::callbackFuction);
}
void callbackFuction()
{
cout << "callbackFuction!!"<< endl;
}
};

红色字体那里报错如下:
error C2664: “CallbackTest::myCallback”: 不能将参数 1 从“void (__thiscall SetCallback::* )(void)”转换为“void (__cdecl *)(void)”


如果改成:
CallbackTest::myCallback((callbackFunction)&SetCallback::callbackFuction);
则报错如下
error C2440: “类型转换”: 无法从“void (__thiscall SetCallback::* )(void)”转换为“callbackFunction”


搞到我有点乱了,除了上面所说错误的地方外,我还想问问2个问题:
1.typedef void (*callbackFunction)();
typedef int aaa;
第一行【typedef void (*callbackFunction)();】是什么意思?
第二行很明显是用aaa代替(或替换吧)int 【即后者替换前者】

2.拿上面一个class的函数来说,通常我们调用函数是:
SetCallback::callbackFuction()
而作为参数传递时却是:
SetCallback::callbackFuction
少了“()”代表着传递什么????

这一系列的问题可能都是源于我对函数指针的不熟悉吧。。。。还望大神们帮助解决。

[解决办法]
1.typedef void (*callbackFunction)();
意思是为 参数为空,返回值为void 的这一类函数 定义一个别名callbackFunction
跟typedef int aaa
意思是为 int定义一个别名 aaa一样
2.少了括号意思是传递函数指针
应该是&SetCallback::callbackFuction,&可省略

3. void (*callbackFunction)() 代表着无返回值的函数指针 没错
(void*)(callbackFunction)()这个没见过等楼下解释。不过貌似该是(void*)(*callbackFunction)()代表 返回值是void指针,参数为空 的函数指针

PS:回调函数一般采用函数对象来做,即重载调用运算符(),std、boost里是这样做的,虽然同样支持函数指针,但内部有很多函数对象,尤其是boost里很多

不需要过于担心效率问题,函数指针在编译时无法内联,而函数对象可以内联,有些时候用函数对象可以比函数指针更快


[解决办法]
忘了你的错误了。。。

对于成员函数,声明的时候应该带上类名即
typedef void (*callbackFunction)();
而在调用的时候也应当对着该类的某个实例调用
SetCallback * pA = new SetCallback;
(pA->*fun)(a, b);

当然,你的例子里没有调用那个函数

读书人网 >C++

热点推荐