HelloLayer::HelloLayer()和HelloLayer::init()的区别

刚开始学做cocos2d-x,不知道该把初始化代码写在HelloLayer::HelloLayer()里面还是写在HelloLayer::init()里面,请问这两种写法的区别是什么?官方TestCpp的演示代码中,有些代码采用前者,有时候又采用后者。
例如HelloLayer.h头文件是:
class HelloLayer : public cocos2d::CCLayer
{
public:
HelloWorld();
virtual ~HelloWorld();
virtual bool init();
};

那么HelloLayer.cpp代码是:
HelloLayer::HelloLayer()
{
//应该把初始化代码写这里?
}

HelloLayer::~HelloLayer()
{}

bool HelloLayer::init()
{
//还是应该把初始化代码写这里?
}

我目前想要干的事情是:先从ccbi读取一个场景或者层,然后往这个层上通过手动写代码来添加CCEditBox控件(毕竟CocosBuilder目前还不支持添加输入框嘛,所以只能自己手工添加)。

当然是两段构造好啊~能把分配内存和初始化部分分开。

:L:L:L:L:L:L:L

cocos2d-x是由cocos2d转来的,cocos2d是objective-c语言写的,objective-c严格来说没有构造函数和析构函数。所有就有init来初始化一些变量。可以说是两段构造,cocos2d-x也延用了这个方法,具体好处不记得了,作者在哪提到过。其实写在哪基本没什么区别的。呵呵,我自己目前的理解,若有不对和不全的地方,请大家指正!

  • 本帖最后由 奇思精彩 于 2012-12-18 17:29 编辑 *

刚才想了一下,如果写成构造函数HelloLayer::HelloLayer(),那么是没有返回值的。而写成init则可以得到初始化成功or失败的返回值。

但是如果写成如下这样,多了个if(){}嵌套,显得笨拙:↓↓↓
bool HelloLayer::init()
{
if (CCLayer::init())
{
//初始化代码,往场景层中添加文本标签或者一些控件
//……
return true;
}
return false;
}

要不,写成这样?显得更巧妙一些?↓↓↓
bool HelloLayer::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(CCLayer::init());
//初始化代码,往场景层中添加文本标签或者一些控件
//……
} while (0);
return bRet;
}

如果写成HelloLayer::init(),那么应该写成如下这样?↓↓↓

bool HelloLayer::init()
{
bool bRet = false;
do
{
//初始化代码,往场景层中添加文本标签或者一些控件
//……
} while (0);
return bRet;
}

还是应该写成如下这样?↓↓↓

bool HelloLayer::init()
{
if (CCLayer::init())
{
//初始化代码,往场景层中添加文本标签或者一些控件
//……
return true;
}
return false;
}

我看到官方TestCpp演示代码中,这几种写法都有存在,有时候这样写,有时候又那样写,不知有什么不同的用意呢?

现在又看了下,果然是二段构造好!