- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
给定基类 gameObject
和派生类 animatedGameObject
,我认为将它们的所有实例存储在 std::vector
。如果 vector GameObjects
声明为 gameObject*
的基类型,则派生对象实例需要强制转换。
例子:
vector<gameObject*> GameObjects;
gameObject A* = new gameObject( ...init... );
animatedGameObject B* = new animatedGameObject( ...init... );
GameObjects.push_back(A);
GameObjects.push_back(B);
// to access the animatedGameObject functions:
static_cast<animatedGameObject*>(GameObjects[1])->functionUniqueToAnimated();
像往常一样害怕,我求助于 Scott Meyers(Effective C++,第 3 版),他写了关于这个主题的文章:
许多程序员认为强制转换只是告诉编译器将一种类型视为另一种类型,但这是错误的。任何类型的类型转换(通过强制转换显式转换或编译器隐式转换)通常会导致代码在运行时执行。
我已经阅读了他的第 27 条:最小化施法两次,但鉴于我对此缺乏经验,我无法回答一个简单的问题“这是一件愚蠢的事情吗?”
我应该提一下,有几个原因是一件愚蠢的事情,与调用 static_cast
无关。这些问题按重要性排序是:
static_cast
可能存在的风险吗?std::vector
更好的数据结构? (只有当有一个很明显时,我才不会要求你为我做研究。)这是我第一次在这里提问,如有必要,请提前致歉。
最佳答案
static_cast
不是完成这项工作的正确工具,除非您知道指针指向 animatedGameObject
而不是 gameObject
.您使用什么数据结构来存储该信息?
在基指针之后确定派生对象的类型是动态调度的工作或 dynamic_cast
.在您的示例中,调用 GameObjects[1]->draw()
应该没有强制转换,因为 draw
应该是一个虚函数。否则你可以使用 dynamic_cast< animatedGameObject & >( * GameObjects[1] )
断言该对象是一个动画游戏对象,并抛出 std::bad_cast
如果不是,则异常(exception)。 (这仍然需要 virtual
中的 class gameObject
函数,通常是它的析构函数。)
但是做static_cast
多态派生类型是一种代码味道。
另外你问是否std::vector
是这个用例的一个很好的数据结构。它是,但不是“裸”指针的 vector 。 C++11 现在提供了执行 new
的“智能指针”内存管理类和 delete
对您来说,使实际的运算符几乎已过时。查看std::unique_ptr
对于这种情况。
关于c++ - 使用 static_cast 处理混合(基础和派生)对象的 vector 是否存在性能风险? (又名 "it this a dumb idea?"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17396893/
我正在构建一个游戏,例如 Same Game ,当我必须创建一个新关卡时,我刚刚运行了一个算法来用 N 种颜色填充板子,这个算法随机填充板子,但显然以这种方式生成的关卡并不是都有解决方案。 我必须做一
有两个 TFLearn 项目 TF Learn (aka Scikit Flow) https://github.com/tensorflow/tensorflow/tree/master/tenso
我正在尝试使用代码从 NSDictionary 中解析一个整数 [activeItem setData_id:[[NSString stringWithFormat:@"%@", [dict valu
是否有在线资源描述 VC10 与 VC9 相比代码生成的变化? 我不是在谈论 c++0x 和其他不错的功能(例如内置 static_assert),也不是在谈论精致的 UI。我需要知道的是,由于优化、
那里。我是 Swift 的初学者,正在尝试将旧程序转换为 Swift3。我设法修复了一堆错误,但我无法使该功能正常工作。 fileprivate func extractEntitlements(_
我正在尝试实现 Easy Game Center link但我得到这个错误: Cannot convert value of type 'NSRange' (aka 'NSRange') to exp
我是 Swift 的新手,我正在尝试按照 lynda.com 上的类(class)编写一个简单的类(class)此代码在视频中运行良好,但在我的系统上出现错误。 protocol JSONDecoda
我的代码中有一个错误,例如“无法将类型‘NSRange’(又名‘_NSRange’)的值转换为预期的参数类型‘Range’(又名‘Range’)”,但我不知道如何解决这个问题请任何人帮助我? 我在这里
检查字符串字符的范围时出现此错误... @objc func textField(textField: UITextField, shouldChangeCharactersInRange range
我正在尝试用属性字符串替换子字符串。以下是我的代码。 let searchText = self.searchBar.text! let name = item.firstName ?? "" let
string convert(string name) { string code = name[0]; ... } 我从这一行得到“没有从'value_type'(又名'char')到'st
标题说明了一切,我相信。我只是好奇 () -> () 是否充当函数的参数... class Test { var isAwesome = true func loadData (callbac
我正在编写这个很棒的应用程序,至少我认为它很棒,在 C 中与 GObject 的完美结合,过了一段时间我开始遇到这个非常非常奇怪的错误。我也相信已经注意到它并不总是出现。然而,这可能只是 IDE 的错
我一直在尝试使用类型族来抽象 UI 工具包。当我尝试使用 HLists (http://homepages.cwi.nl/~ralf/HList/) 来改进 API 时,我陷入了困境。 我的 API
在 Scala 中,as explained in the PR that introduced it , parasitic允许偷窃 execution time from other thread
我在网上看到过这个关于加载效果的回车示例,但我无法正确理解它。为什么它必须是 2 \rLoading 而不是 1?有人可以给我解释一下吗? for (int j = 0; j < 3; j++) {
我有一个字符串列表 strs = [ 'foo', 'bar' ] 和一些字典 foo = {'a': 1, 'b': 2}, bar = {'a': 3, 'b': 4}。我想使用 with_ite
我有一个由许多点组成的LineString(坐标字符串),我想计算沿线最近的距离(从第一个点到最后一个点,方向性很重要)到一个点,就像这样说的:"project()" calculation 如果我不
所以最近我确实为我的业务购买了一些模板。它们基于 HTML/CSS/JQUERY/JS/PHP。 问题如下:在我的领域,并发率非常高,人们下载模板并自己使用它们是很常见的。由于我确实为它们付出了很多,
我认为这很容易找到预制的,但似乎我在网上找到的任何解决方案都只能解决部分问题。 我想对用户提供的文件名列表进行排序(这些文件大多以人和/或地址命名),有时使用不同的语言(主要是德语,带有一些法语和意大
我是一名优秀的程序员,十分优秀!