回调函数

回调函数是指程序运行时在其他函数中被调用的函数,该函数一般来说是运行时被传进到“另外一个函数”的函数,当调用的时机到达后在”另外一个函数”中被调用。回调函数在游戏服务器中使用较为广泛,比如针对删除npc这个操作:

//封装了回调函数及其相关数据结构

struct Delete

{

    set<Npc> test;

    bool exec(Npc n) {//回调函数,找到需要删除的npc

        if (n->can_delete()) {//如果n可被删除

            test.insert(n);

        }

        return true;

    }

};

//遍历场景上每一个npc

void execAllScene(Delete& del)

{

    for (...) {

        del.exec(npc);

    }

}

//删除npc

void realDelete(Delete& del)

{

    ....

}

Delete del;

scene->execAllScene(del,...);

scene->realDelete(del,...);

这样一来,把定义的Delete对象del传进一个遍历场景上的npc操作的函数execAllScene中,然后在该execAllScene中调用exec即可把场景上可删除的npc加入 待删除npc-set容器中。再把对象del传入另外一个函数realDelete中,即可完成对npc的删除操作。

这一类的应用一般写法如下:

第一种写法:

struct TestCallBack

{

    TestCallBack(){}

    virtual void exec(...){return ;} 

};

struct MyCallBack : public TestCallBack

{

    MyCallBack(){}

    void exec(...) {

        ...//执行某种操作

    }

};

void exec_every(TestCallBack& call)

{

    call.exec(...);//针对一种参数执行exec

    call.exec(...);//针对另外一种参数执行exec

    ...

}

MyCallBack cb;

exec_every(b);

其实上述代码这样写可能看起来更加容易理解:

第二种写法:

void exec()

{

    ...//执行某种操作

}

void exec_every()//直接遍历所有的参数类型

{

    exec(...);//针对一种参数执行exec

    exec(...);//针对另外一种参数执行exec

    ...

}

exec_every();

对比两种写法,可以发现前一种方法是对后一种方法进行了封装,更加符合面向对象的思维方式,而后一种方法更加直观容易理解。

参考资料:

https://blog.csdn.net/user_920/article/details/46692259?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://blog.csdn.net/u014337397/article/details/80328277?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://blog.csdn.net/qq_26849233/article/details/82156019?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://blog.csdn.net/feiye1023/article/details/55521977?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值