首页 数据库 mysql教程 Cocos2dx 3.0 过渡篇 (二十) 闲扯强制类型转换

Cocos2dx 3.0 过渡篇 (二十) 闲扯强制类型转换

Jun 07, 2016 pm 03:19 PM
强制 类型 转换 过渡

这篇博文其实和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的写法...)


为了完成强制类型转换,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没有继承关系
}</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的东东,但不知道到底是什么类型的,那会怎么做呢?步骤其实很简单:
1、取出一个骰子;
2、使出吃奶的力气摇骰子;
3、根据点数的大小决定该转换成什么类型...................

这里假设要转换成LabelTTF类型的(很明显猜错了,应该是Sprite型的)
auto label = static_cast<labelttf>(this->getChildByTag(99));
label->setString("天才一般的我肯定猜对了,哇哈哈,动感超人!");//呵呵,呵呵</labelttf>
登录后复制
上面这种做法会产生什么后果呢?呵呵。
其实我只是想通过这种方法告诉小伙伴们,珍爱生命,远离赌博
那么,有什么办法可以避免上述这种不靠谱的强制类型转换吗?回答当然是有的,那就是比安全那啥还安全的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");  
}</labelttf>
登录后复制

恩,我的理解就只是这样啦,再说下去又要暴露些什么了...


http://blog.csdn.net/start530/article/details/21990081


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

全角英文字母转换为半角形式的实用技巧 全角英文字母转换为半角形式的实用技巧 Mar 26, 2024 am 09:54 AM

全角英文字母转换为半角形式的实用技巧在现代生活中,我们经常会接触到英文字母,在使用电脑、手机等设备时也经常需要输入英文字母。然而,有时候我们会遇到全角英文字母的情况,而我们需要使用的是半角形式。那么,如何将全角英文字母转换为半角形式呢?下面就为大家介绍一些实用的技巧。首先,全角英文字母和数字是指在输入法中占据一个全角位置的字符,而半角英文字母和数字则是占据一

如何在Windows 11/10中将ODT转换为Word? 如何在Windows 11/10中将ODT转换为Word? Feb 20, 2024 pm 12:21 PM

在这篇文章中,我们将向您展示如何将OpenDocumentTextDocument(ODT)文件转换为MicrosoftWord(Docx、DOC等)。格式。如何在Windows11/10中将ODT转换为Word以下是您可以在WindowsPC上将ODT文档转换为DOC或DOCX格式的方法:使用写字板或Word将ODT转换为Word我们要向您展示的第一种方法是使用写字板或MicrosoftWord将ODT转换为Word。以下是实现这一点的步骤:首先,使用“开始”菜单打开写字板应用程序。现在,转到

Golang时间处理:如何在Golang中将时间戳转换为字符串 Golang时间处理:如何在Golang中将时间戳转换为字符串 Feb 24, 2024 pm 10:42 PM

Golang时间转换:如何将时间戳转换为字符串在Golang中,时间操作是非常常见的操作之一。有时候我们需要将时间戳转换为字符串,以便于展示或者存储。本文将介绍如何使用Golang将时间戳转换为字符串,并提供具体的代码示例。1.时间戳和字符串的转换在Golang中,时间戳通常是以整型数字的形式表示的,表示的是从1970年1月1日至当前时间的秒数。而字符串则

PHP 月份转换为英文月份的实现方法详解 PHP 月份转换为英文月份的实现方法详解 Mar 21, 2024 pm 06:45 PM

这篇文章将详细介绍如何将PHP中的月份转换为英文月份的方法,同时给出具体的代码示例。在PHP开发中,有时候我们需要将数字表示的月份转换为英文的月份,这在一些日期处理或数据展示的场景下非常实用。下面将从实现原理、具体代码示例和注意事项等方面进行详解。一、实现原理在PHP中,可以通过使用DateTime类和format方法来实现将数字月份转换为英文月份。Date

qq音乐怎么转换mp3格式 手机上qq音乐转mp3格式 qq音乐怎么转换mp3格式 手机上qq音乐转mp3格式 Mar 21, 2024 pm 01:21 PM

  qq音乐让大家尽情享受观影解闷,每天都可以使用这个软件,轻松满足自己的使用,优质海量的歌曲,任由大家畅听,也可以下载保存起来,下次听的时候,不需要网络,而在这里下载的歌曲不是MP3格式的,无法在其他平台使用,会员歌曲过期后也没有办法再听了,所以很多小伙伴们,都想要将歌曲转换成MP3格式的,在这里小编为你们提供方法,帮助大家都可以使用起来!  1、打开电脑qq音乐,点击右上角【主菜单】按钮,点击【音频转码】,选择【添加歌曲】选项,添加需要转换的歌曲;  2、添加歌曲完毕,点击选择转换为【mp3

全角英文字母变为半角字母的方法 全角英文字母变为半角字母的方法 Mar 25, 2024 pm 02:45 PM

全角英文字母变为半角字母的方法在日常生活和工作中,有时候我们会遇到需要将全角英文字母转换为半角字母的情况,比如在输入电脑密码、编辑文档或者设计排版时。全角英文字母和数字是指宽度与中文字符相同的字符,而半角英文字母则是指宽度较窄的字符。在实际操作中,我们需要掌握一些简单的方法,来将全角英文字母转换为半角字母,以便更方便地处理文本和数字。一、全角英文字母与半角英

PHP教程:如何将int类型转换为字符串 PHP教程:如何将int类型转换为字符串 Mar 27, 2024 pm 06:03 PM

PHP教程:如何将int类型转换为字符串在PHP中,将整型数据转换为字符串是一种常见的操作。本教程将介绍如何使用PHP内置的函数将int类型转换为字符串,同时提供具体的代码示例。使用强制类型转换:在PHP中,可以使用强制类型转换的方式将整型数据转换为字符串。这种方法非常简单,只需要在整型数据前加上(string)即可将其转换为字符串。下面是一个简单的示例代码

视频矩阵账号怎么做?它的矩阵账号都有哪些类型呢? 视频矩阵账号怎么做?它的矩阵账号都有哪些类型呢? Mar 21, 2024 pm 04:57 PM

随着短视频平台的盛行,视频矩阵账号营销已成为一种新兴营销方式。通过在不同平台上创建和管理多个账号,企业和个人能够实现品牌推广、粉丝增长和产品销售等目标。本文将为您探讨如何有效运用视频矩阵账号,并介绍不同类型的视频矩阵账号。一、视频矩阵账号怎么做?要想做好视频矩阵账号,需要遵循以下几个步骤:首先要明确你的视频矩阵账号的目标是什么,是为了品牌传播、粉丝增长还是产品销售。明确目标有助于制定相应的策略。2.选择平台:根据你的目标受众,选择合适的短视频平台。目前主流的短视频平台有抖音、快手、火山小视频等。

See all articles