关于cocos2dx CCCallfunc对象的传参 (2.x)

关于cocos2dx CCCallfunc对象的传参 (2.x),第1张

概述    之前就觉得这个回调对象很麻烦,需要在create的时候,就把参数设置进去,然后execute的时候,只是直接用开始设定的参数调用这个函数。要更改,只能获取这个对象,然后用setObject来做,设置完了再execute。     而现在做lua,发现有这么一种神奇的做法: function MessageCenter:send(message , ...) if self.hand

之前就觉得这个回调对象很麻烦,需要在create的时候,就把参数设置进去,然后execute的时候,只是直接用开始设定的参数调用这个函数。要更改,只能获取这个对象,然后用setobject来做,设置完了再execute。


而现在做lua,发现有这么一种神奇的做法:

function MessageCenter:send(message,...)    if self.handlers[message] ~= nil then        for k,v in pairs(self.handlers[message]) do            self:onMsg(k,v,... )        end    endend
function MessageCenter:onMsg(target,callback,...)     callback(target,...)end


一分析,貌似C++也可以这么做啊,做了如下测试:
class base{public:    int tag;};typedef voID (base::*SEL_CallFunc)(int ID,...);#define CALLFUNC_SELECTOR(_SELECTOR) static_cast<SEL_CallFunc>(&_SELECTOR)class callfunc{public:    base* target;    SEL_CallFunc func;        voID execute(int ID,...)    {        base* tmp = nullptr;                va_List argList;        va_start(argList,ID);        while(1)        {            tmp = va_arg(argList,base*);                        if(tmp!=nullptr)            {                (target->*func)(ID,tmp,nullptr);            }            else            {                break;            }        }        va_end(argList);    }};class child : public base{public:    voID testFunc(int ID,base*);                        if(tmp!=nullptr)            {                cout<<"ID : "<<ID<<"  base tag : "<<tmp->tag<<endl;            }            else            {                break;            }        }        va_end(argList);    }};int main(int argc,const char * argv[]){    child *c = new child;    callfunc *cf = new callfunc;        cf->target = c;    cf->func = CALLFUNC_SELECTOR(child::testFunc);            base *iNode = new base;    iNode->tag = 1989;        cf->execute(2,iNode,nullptr);        return 0;}

测试能得到正常的结果。

说明可以实现


然后开始想,为什么之前C++不这样做呢。。。

想来想去,发现:

1、C++的强类型,支持动态特性有限,导致接收的变参类型不一致的时候,很麻烦。

2、类成员函数还要做静态转型,才能完成这样的封装(当然引擎里面一直是这么做的。。。)

3、这样好像也不比之前的setobject这一系列的 *** 作简单。。。

总结

以上是内存溢出为你收集整理的关于cocos2dx CCCallfunc对象的传参 (2.x)全部内容,希望文章能够帮你解决关于cocos2dx CCCallfunc对象的传参 (2.x)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1047045.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存