C++实现函数回调

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
仍然可以实现,自此即可实现函数回调问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值