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,您的编码准则是什么。发生在我身上,也许也发生在你身上。因此,它远非一文不值。