COCOS2DX之类型强制转换~(亦为C++)
来源:互联网 发布:java ee插件下载 编辑:程序博客网 时间:2024/05/17 01:55
这篇博文其实和Cocos2dx 3.0关联性并不大,只是我近来对强制类型转换恶补了下,写在这里当笔记用吧...
抱着羞愧的心理,我决定本文尽量说的简单、严肃点...
以前用C时,习惯用(int)a这样的格式来强制转换类型。用cocos2dx,例如下面这种写法:
- Sprite* sp = (Sprite*)this->getChildByTag(1);
为了完成强制类型转换,C++中已经为我们提供了4中标准方法,它们是dynamic_cats, static_cast, const_cast, reinterpret_cast,用法形式如:dynamic_cast<类型说明符>(表达式),之所以分成4类,就表示他们各自有着不同的使用环境。
我觉的通常情况下用dynamic_cast最好,它检查的更严格些,其次是static_cast,而后两者也就是const_cast和reinterpret_cast较之前两者貌似不太常用(我会告诉你我根本就没用过吗...),而且也不推荐使用,const_cast在用于去除const的地方还是有所发挥的,reinterpret_cast在转换时,不会在内存中进行补足比特位(例如int转换到double,需要补足4字节),这往往是不安全的,而且代码也是不可移植的。
所以我主要介绍的还是static_cast和dynamic_cast。
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没有继承关系
- }
- 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的坐标发生改变,说明获取成功
1、取出一个骰子;
2、使出吃奶的力气摇骰子;
3、根据点数的大小决定该转换成什么类型...................
这里假设要转换成LabelTTF类型的(很明显猜错了,应该是Sprite型的)
- auto label = static_cast<LabelTTF*>(this->getChildByTag(99));
- label->setString("天才一般的我肯定猜对了,哇哈哈,动感超人!");//呵呵,呵呵
其实我只是想通过这种方法告诉小伙伴们,珍爱生命,远离赌博。
那么,有什么办法可以避免上述这种不靠谱的强制类型转换吗?回答当然是有的,那就是比安全那啥还安全的dynamic_cast
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");
- }
0 0
- COCOS2DX之类型强制转换~(亦为C++)
- c语言之强制类型转换
- c++-----强制类型转换
- 【C++】强制类型转换
- C 强制类型转换
- C 强制类型转换
- C 强制类型转换
- 强制类型转换 (c++primer)
- C/C++强制类型转换。。。
- c/c++强制类型转换
- C语言类型强制转换
- c/c++强制类型转换
- C语言强制类型转换
- C中的类型强制转换
- c/c++强制类型转换
- C语言类型强制转换
- C/C++类型强制转换
- C语言强制类型转换
- subprocess子进程的杀死
- NYOJ 269--VF
- 我的《C陷阱与缺陷》读书笔记
- CentOS操作杂记
- C语言:位异或运算符
- COCOS2DX之类型强制转换~(亦为C++)
- strings命令
- cal
- C语言基础——指针
- LockSupport的park和unpark的基本使用,以及对线程中断的响应性
- 限制对比度自适应直方图均衡
- CSS字体
- hdu 4910 Problem about GCD
- ttserver启动、关闭和基本操作