对HelloWorld类不能找到create()函数的声明的推测

来源:互联网 发布:网络用语mjd什么意思 编辑:程序博客网 时间:2024/05/21 19:06
下面的代码中调用了HelloWorld::create();
CCScene*HelloWorld::scene(){    // 'scene' is anautorelease object    CCScene *scene = CCScene::create();  //创建场景对象,且自动回收内存      // 'layer' is anautorelease object    HelloWorld *layer = HelloWorld::create();//创建图层(布景层)对象,且自动回收内存    // add layer as achild to scene    scene->addChild(layer);         //在场景中加入图层      // return thescene    returnscene;}

但是 helloworld中没有creat成员函数,只有宏定义CREATE_FUNC(HelloWorld);

/** * define a create function for a specific type, such as CCLayer * @__TYPE__ class type to add create(), such as CCLayer */#define CREATE_FUNC(__TYPE__) \static __TYPE__* create() \{ \    __TYPE__ *pRet = new __TYPE__(); \    if (pRet && pRet->init()) \    { \        pRet->autorelease(); \        return pRet; \    } \    else \    { \        delete pRet; \        pRet = NULL; \        return NULL; \    } \}

为啥要这样写呢?


我觉得是为了消除重复代码,因为很多类需要用到creat,而这些类的creat都是相同的功能,他们都调用这个宏,就可以多态的生成自己类的creat

但是这样不会代码膨胀么?

个人觉得cocos2dx里没有类模板与函数模板(为啥?不需要模板么),所以不以通过调用模板函数来消除重复代码;

也没有虚定义creat:static CCLayer *create(void);//只有CClayer里有定义,而且和宏定义的差不多啊

这样就只能“实现继承”不是“接口继承”了(这又是为啥?)

CCLayer *CCLayer::create(){    CCLayer *pRet = new CCLayer();    if (pRet && pRet->init())    {        pRet->autorelease();        return pRet;    }    else    {        CC_SAFE_DELETE(pRet);        return NULL;    }}
这相当于重新定义了重名函数,那么以父类指针指涉派生类时,调用的将是父类版本(跟随指针类型去调用);如果定义为虚函数则是调用派生类版本(跟随对象类型去调用)

再或者,工厂函数简体版都是这么写的?


希望以后逐渐能解决上述问题

0 0
原创粉丝点击