这篇博文其实和Cocos2dx 3.0关联性并不大,只是我近来对强制类型转换恶补了下,写在这里当笔记用吧... 抱着羞愧的心理,我决定本文尽量说的简单、严肃点... 以前用C时,习惯用(int)a这样的式来强制转换类型。用cocos2dx,例如下面这种写法: Sprite* sp = (S
这篇博文其实和Cocos2dx 3.0关联性并不大,只是我近来对强制类型转换恶补了下,写在这里当笔记用吧...
抱着羞愧的心理,我决定本文尽量说的简单、严肃点...
以前用C时,习惯用(int)a这样的格式来强制转换类型。用cocos2dx,例如下面这种写法:
Sprite* sp = (Sprite*)this->getChildByTag(1);但毕竟cocos2dx是用C++而不是用C,所以我们应入乡随俗,还是应该用C++本家的方式来写转换格式会比较好。(其实我以前都是用C的写法...)
1、static_cast
static_cast类似C风格的强制类型转换。它适用于基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。用法如下:
class A { ... }; class B { ... }; class D : public B { ... }; void f(B* pb, D* pd) { D* pd2 = static_cast<d>(pb); // 不安全, pb可能只是B的指针 B* pb2 = static_cast<b>(pd); // 安全的 A* pa2 = static_cast<a>(pb); //错误A与B没有继承关系 }</a></b></d>在cocos2dx 中,有这样的一种用法:
auto boy = Sprite::create("boy.png");//创建一个精灵 boy->setPosition(Point(200,400)); boy->setTag(99);//设置精灵的tag this->addChild(boy,2); //在其他函数里,我们要使用到精灵boy,用下面的方法调用 auto boy = static_cast<sprite>(this->getChildByTag(99)); boy->setPosition(Point(50,50));//运行后精灵boy的坐标发生改变,说明获取成功</sprite>上面的情况是我在知道tag为99的child是一个Sprite类,所以我才会将其取出来后强制转化为Sprite*,可是如果我只知道有个tag为99的东东,但不知道到底是什么类型的,那会怎么做呢?步骤其实很简单:
auto label = static_cast<labelttf>(this->getChildByTag(99)); label->setString("天才一般的我肯定猜对了,哇哈哈,动感超人!");//呵呵,呵呵</labelttf>上面这种做法会产生什么后果呢?呵呵。
2、dynamic_cast
与其他强制类型转换不同,dynamic_cast在转换过程中涉及类型检查。如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败,并返回nullptr。
换句话说:如果你要将Sprite* 强制转化为LabelTTF,dynamic_cast绝对不允许你这么乱搞的!它会用返回nullptr的形式告诉你,LabelTTF和Sprite并不是同一物种,重口味者慎入!
下面修改之前的代码:
auto label = dynamic_cast<labelttf>(this->getChildByTag(99)); if( label ) { label->setString("有了dynamic_cast,老板再也不用担心我乱来了"); } else { CCLOG("Attention : label doesn't point to LabelTTF Objective"); }</labelttf>