热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

Cocos2d-x中的强制类型转换

为了完成强制类型转换,C中已经为我们提供了4中标准方法,它们是dynamic_cats,static_cast,const_cast,reinterpret_cast,用法形式如:dynamic_cast类型说明符(表达式),之所以分成4类,就表示他们各自有着不同的使用环境。我觉的通常情况下用dynamic_c

为了完成强制类型转换,C中已经为我们提供了4中标准方法,它们是dynamic_cats, static_cast, const_cast, reinterpret_cast,用法形式如:dynamic_cast类型说明符(表达式),之所以分成4类,就表示他们各自有着不同的使用环境。 我觉的 通常情况下用dynamic_c

为了完成强制类型转换,C&#43;&#43;中已经为我们提供了4中标准方法,它们是dynamic_cats, static_cast, const_cast, reinterpret_cast,用法形式如:dynamic_cast<类型说明符>(表达式),之所以分成4类,就表示他们各自有着不同的使用环境。


我觉的通常情况下用dynamic_cast最好,它检查的更严&#26684;些,其次是static_cast,而后两者也就是const_cast和reinterpret_cast较之前两者貌&#20284;不太常用(我会告诉你我根本就没用过吗...),而且也不推荐使用,const_cast在用于去除const的地方还是有所发挥的,reinterpret_cast在转换时,不会在内存中进行补足比特位(例如int转换到double,需要补足4字节),这往往是不安全的,而且代码也是不可移植的。
所以我主要介绍的还是static_cast和dynamic_cast。


1、static_cast
static_cast类&#20284;C风&#26684;的强制类型转换。它适用于基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。用法如下:

[cpp] view plaincopy

  1. class A { ... };
  2. class B { ... };
  3. class D : public B { ... };
  4. void f(B* pb, D* pd)
  5. {
  6. D* pd2 = static_cast(pb); // 不安全, pb可能只是B的指针
  7. B* pb2 = static_cast(pd); // 安全的
  8. A* pa2 = static_cast(pb); //错误A与B没有继承关系
  9. }

在cocos2dx 中,有这样的一种用法:

[cpp] view plaincopy

  1. auto boy = Sprite::create("boy.png");//创建一个精灵
  2. boy->setPosition(Point(200,400));
  3. boy->setTag(99);//设置精灵的tag
  4. this->addChild(boy,2);
  5. //在其他函数里,我们要使用到精灵boy,用下面的方法调用
  6. auto boy = static_cast(this->getChildByTag(99));
  7. boy->setPosition(Point(50,50));//运行后精灵boy的坐标发生改变,说明获取成功

上面的情况是我在知道tag为99的child是一个Sprite类,所以我才会将其取出来后强制转化为Sprite*,可是如果我只知道有个tag为99的东东,但不知道到底是什么类型的,那会怎么做呢?步骤其实很简单:
1、取出一个骰子;
2、使出吃奶的力气摇骰子;
3、根据点数的大小决定该转换成什么类型...................

这里假设要转换成LabelTTF类型的(很明显猜错了,应该是Sprite型的)

[cpp] view plaincopy

  1. auto label = static_cast(this->getChildByTag(99));
  2. label->setString("天才一般的我肯定猜对了,哇哈哈,动感超人!");//呵呵,呵呵

上面这种做法会产生什么后果呢?呵呵。
其实我只是想通过这种方法告诉小伙伴们,珍爱生命,远离赌博
那么,有什么办法可以避免上述这种不靠谱的强制类型转换吗?回答当然是有的,那就是比安全那啥还安全的dynamic_cast

2、dynamic_cast
与其他强制类型转换不同,dynamic_cast在转换过程中涉及类型检查。如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败,并返回nullptr。
换句话说:如果你要将Sprite* 强制转化为LabelTTF,dynamic_cast绝对不允许你这么乱搞的!它会用返回nullptr的形式告诉你,LabelTTF和Sprite并不是同一物种,重口味者慎入!
下面修改之前的代码:

[cpp] view plaincopy

  1. auto label = dynamic_cast(this->getChildByTag(99));
  2. if( label )
  3. {
  4. label->setString("有了dynamic_cast,老板再也不用担心我乱来了");
  5. }
  6. else
  7. {
  8. CCLOG("Attention : label doesn't point to LabelTTF Objective");
  9. }


恩,我的理解就只是这样啦,再说下去又要暴露些什么了...
推荐阅读
  • 本文介绍了EasyTrac 0.1.0.11b1版本的发布,这是一个简化Trac部署过程的工具,特别适合于希望快速搭建项目管理和问题跟踪系统的用户。 ... [详细]
  • Linux 文件系统结构详解
    本文详细介绍了Linux操作系统的文件系统结构,包括其独特的树状目录体系、根目录的作用、目录与磁盘分区的关系等,并对各主要目录的功能进行了深入解析。 ... [详细]
  • 一人有限公司的风险与应对策略
    创业者在选择公司形式时,往往对一人有限公司存在误解。虽然表面上看似简单易操作,但实际上,这种公司形式隐藏着较大的法律风险,尤其是在股东责任方面。本文将深入探讨为何应谨慎考虑注册一人有限公司,并提供相应的风险管理建议。 ... [详细]
  • Web安全入门:MySQL基础操作与SQL注入防范
    本文详细介绍了MySQL数据库的基础操作命令,包括数据库和表的基本管理,以及数据的增删查改等常用操作。同时,针对Web安全领域常见的SQL注入问题,提供了初步的理解和防范措施。 ... [详细]
  • 本文针对公司项目中普遍存在的IE浏览器兼容性问题,特别是IE9及以下版本,提出了具体的解决方案,确保用户在这些旧版浏览器中也能顺利实现图片上传预览功能。 ... [详细]
  • 本文提供了一套详细的步骤,指导用户如何通过科学上网方法注册一个美国地区的Apple ID,包括设置地区、语言及完成注册的具体操作。 ... [详细]
  • mysql 分库分表策略_【数据库】分库分表策略
    关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多, ... [详细]
  • 在现代多线程编程中,Lock接口提供的灵活性和控制力超越了传统的synchronized关键字。Lock接口不仅使锁成为一个独立的对象,还提供了更细粒度的锁定机制,例如读写锁(ReadWriteLock)。本文将探讨如何利用ReentrantReadWriteLock提高并发性能。 ... [详细]
  • 项目管理可细分为九个层次,每个层次都代表着不同的能力和视角。本文将详细介绍这九个层次的内容,帮助读者评估自身所处的阶段,并提供进一步学习和发展的方向。 ... [详细]
  • 解析程序员与软件工程师的角色差异
    本文深入探讨了程序员与软件工程师之间的主要区别,包括它们的职业定位、技能要求以及工作内容等方面的不同,旨在帮助读者更好地理解这两个角色的特点。 ... [详细]
  • java锁策略
    文章目录锁的分类一、乐观锁VS悲观锁二、读写锁三、可重入锁VS不可重入锁四、重量级锁VS轻量级锁五、公平锁VS非公平锁六、自旋锁VS挂起等待锁七、锁升级策略1、无锁: ... [详细]
  • 本文详细探讨了当前主流的两种系统架构——C/S(客户端/服务器)与B/S(浏览器/服务器)架构的特点、优缺点及未来的发展趋势。 ... [详细]
  • 解决Win10播放设备故障的有效步骤
    当用户尝试播放媒体文件时,有时会遇到播放设备无法正常工作的错误提示。这种情况可能由多种原因引起,包括驱动程序问题或系统更新后的兼容性问题等。本文将提供一系列解决方案,帮助用户快速解决问题。 ... [详细]
  • 本文精选了小学阶段常见的近义词和反义词,旨在帮助学生更好地理解和运用这些词汇,提高语文学习效果。 ... [详细]
  • 本文档详细介绍了华为HCNA-IoT认证的相关信息,包括认证的核心技能要求、涵盖的知识领域以及技术分支,旨在帮助学员全面了解并准备认证考试。 ... [详细]
author-avatar
hjalshj
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有