1.关于C++实现函数回调有大体两种思路
1.1.首先模仿java接口,定义一个纯虚类,让当前类继承该类,从而重写该方法,但是局限在于函数名称固定,无法应对用户自定义函数;
1.2使用函数指针,但是有所不同的是对于成员函数的函数指针显然没那么简单,需要同时保存函数指针,可当前对象指针才能实现,具体不多说,可参考以下:
cocos2d-x 回调函数详解
2.由此受到启发,可以将成员函数指针以及当前对象指针保存,构建为另一个类,从而实现函数回调。
class Point
{
public:
int x,y;
void pin()
{
cout<<x<<" "<<y<<endl;
}
void setXY(int x,int y)
{
this->x=x;
this->y=y;
}
};
typedef void (Point::*CALL_BACK)(int ,int);
class Listener
{
public:
CALL_BACK f;
Point* listener;
void DoSomeThing(int x,int y)
{
(listener->*f)(x,y);
}
};
int main()
{
Point p;
p.setXY(1,100);
p.pin();
Listener lis;
lis.f=(CALL_BACK)&Point::setXY;
lis.listener=&p;
lis.DoSomeThing(0,0);
p.pin();
return 0;
}
//输出:
1 100
0 0
更进一步
class Base
{
public:
int c,d;
};
class Point: public Base
{
public:
int x,y;
void pin()
{
cout<<x<<" "<<y<<endl;
}
void setXY(int x,int y)
{
this->x=x;
this->y=y;
}
};
typedef void (Base::*CALL_BACK)(int ,int);
class Listener
{
public:
CALL_BACK f;
Point* listener;
void DoSomeThing(int x,int y)
{
(listener->*f)(x,y);
}
};
int main()
{
Point p;
p.setXY(1,100);
p.pin();
Listener lis;
lis.f=(CALL_BACK)&Point::setXY;
lis.listener=&p;
lis.DoSomeThing(0,0);
p.pin();
return 0;
}
//输出:
1 100
0 0