Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这里的动态演员阵容合适吗?_C++ - Fatal编程技术网

C++ 这里的动态演员阵容合适吗?

C++ 这里的动态演员阵容合适吗?,c++,C++,比如说在游戏中,我们有相互沟通的实体。假设一个玩家与一个物品发生碰撞,现在,该物品应该放在他的std::vector 当玩家收到碰撞消息时,他将该项目作为一个实体*。玩家将其作为物品施放是否合适?如果施放成功,是否将物品推入库存 即使游戏向他发送了一条HIT_项目信息,他仍然需要施放该信息才能将其推入 谢谢如果您能自己满意地回答这些问题,那么请回答 为什么播放机接收到的碰撞消息是实体*,而不是项目* 在潜在转换点,您确定它将是动态类型的项目吗?如果不是呢 有没有什么方法可以相对轻松地重新设计代

比如说在游戏中,我们有相互沟通的实体。假设一个玩家与一个物品发生碰撞,现在,该物品应该放在他的
std::vector

当玩家收到碰撞消息时,他将该项目作为一个实体*。玩家将其作为物品施放是否合适?如果施放成功,是否将物品推入库存

即使游戏向他发送了一条HIT_项目信息,他仍然需要施放该信息才能将其推入


谢谢

如果您能自己满意地回答这些问题,那么请回答

  • 为什么播放机接收到的碰撞消息是实体*,而不是项目*
  • 在潜在转换点,您确定它将是动态类型的项目吗?如果不是呢
  • 有没有什么方法可以相对轻松地重新设计代码以避免强制转换

无论如何,不要武断。如果在目前的情况下,沮丧比其他事情更方便,那就去做吧。IMHO

dynamic_cast
帮助您在执行向下广播时检查有效性

如果指针或引用无法安全降级,它将返回一个
NULL
或抛出一个异常(
std::bad_cast
,用于引用)


除非向我们展示类结构,否则不清楚该怎么说。

将类型成员与GetType()函数一起添加到基类中如何?这就是我通常解决这些“铸造”问题的方法


此外,如果您要使用dynamic_cast,请不要忘记打开RTTI(请忽略它,这是显而易见的)。

您应该问自己的主要问题是-我可以将其作为实体上的虚拟函数吗?在这种情况下,我可能会说“不”,因为非物品知道或关心你将如何处理物品是没有意义的。所以
dynamic\u cast
可能是正确的解决方案-您可以安全地处理
null
返回的情况,并且它可以使其他派生类不必知道任何关于Item的信息。

您能举一个重新设计的例子,不需要强制转换就可以做到这一点吗?我的消息类有一个实体*这就是为什么所有东西都以这种方式发送。我的消息类是否应该包含指向游戏中每个实体类型的指针?@Milo:不应该。我不知道你的内心。有数百种模式可用于这些目的-每种模式都适用于自己的情况。。。然而,根据我的经验,就通用消息而言,通常有downcasts@Milo:一个例子是双重派遣访客,将物品添加到玩家库存中。搜索“double dispatch”,它应该会给你足够的例子。即使我知道类型,我也不能把一个实体*塞进Item*的向量中,可以吗?@Milo:Entity和Item之间的关系是什么?即使你知道Entity消息是一个使用
GetType
函数的
,你仍然需要强制转换它-当然,你可以
static\u cast
it,这会更快一点。当然不,不,不。GetType->typeid()。您在这里没有解决任何问题,添加您自己的GetType函数是毫无价值的。@DeadMG想象一下,如果您不允许使用RTTI,您的编码准则是什么。发生在我身上,也许也发生在你身上。因此,它远非一文不值。