对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
- 对HelloWorld类不能找到create()函数的声明的推测
- 对JFrame的getContentPane()的一些推测。
- 不能声明为虚函数的函数
- 不能声明为虚函数的函数
- 不能声明为虚函数的函数:
- 不能声明为虚函数的函数
- 不能声明为虚函数的情况
- 对被调用的函数作声明
- 对外部函数的声明要注意
- 常见的不不能声明为虚函数的函数
- 关于DisPatchMessage的推测
- 构造函数不能声明为虚函数的原因是:
- 不能被声明为虚函数的C++函数
- 【c++】不能被声明为虚函数的C++函数
- 不能被声明为虚函数的C++函数
- .不能被声明为虚函数的C++函数
- 构造函数不能声明为虚函数的原因是:
- 不能被声明为虚函数的C++函数
- 模块的耦合和内聚
- java 判断字符串中是否有中文
- 1002. Valuable Jewellery
- Eclipse基础--使用links方式安装Eclipse插件
- Java的Daemon线程
- 对HelloWorld类不能找到create()函数的声明的推测
- 如何判断主力在不在?
- 求平方和
- MonoDevelop 断点调试 Unity3D 的2种方法 及附加进程失败问题的解决方法
- umask的作用
- iOS: Directory not empty
- 插件程序开发
- Cocos2d-x-2.2.2的使用新方法
- uva 162 - Beggar My Neighbour(simulation)