具有不同参数的派生类中的C ++方法

时间:2013-06-12 15:26:39

标签: c++ overloading

这是一个关于如何实现我最近遇到的一些需求的问题。我确信这有一种模式或共同的解决方案,即使我已经有一个,我也渴望了解更多。

假设我正在一个游戏中工作,其中与游戏本身相关的所有实体都来自“演员”类(比如说“障碍物”,“移动障碍物”,“射弹”和“大炮”)。在游戏中,所有这些实体都存储在std::vector<Actor *>向量中,以便可以遍历它们。

现在,让我们假设每个“演员”可以在每个回合“做”某事,让我们给他们一个方法“行动”。 Obstacle :: act会做的很少,Moving_obstacle :: act和Projectile :: act会移动它们,而“Cannon :: act”会创造一个新的射弹。有一个纯粹的虚函数Actor :: act是有意义的,所以我可以反过来做类似的事情:

std::vector<Actor *>::iterator b=myvectorofactors.begin(), e=myvectorofactors.end();
while(b < e)
{
    *b->act();
     b++;
}

让他们都“表演”。好吧,到目前为止一切都那么好......事实是,Cannon :: act可能有不同的原型或返回值(例如,存储生成的射弹和推进器将其推入矢量)并且这个“小”差异打破一切。

现在,我知道从某些角度来看,这些方法的重载是完全不同的功能。我也知道,人们总是可以提前计划,并以足够的远见来解决问题...或者只是可以解决问题。

在这种情况下,我只是为每个派生的Actor类使用了不同的唯一标识符,并使用它们转换为对应的类并围绕它们进行工作。我相信我会再次遇到同样的问题,我很想知道一些入门级解决方案。

提前感谢您的时间。

2 个答案:

答案 0 :(得分:3)

开始是合理的,你在这里出轨:

  

问题是,Cannon :: act可以有不同的原型或返回值(例如,存储生成的抛射物并将其推入向量中)

为什么会这样?行为是行为。实例必须在没有任何其他的情况下弄明白。您应该在行动之前在ctor或其他电话中训练它。或者它应该在法案电话期间环顾四周。

考虑一下:即使你神奇地为不同的参数准备好了有效载荷,在引用中它会如何计算出来?电话是抽象的。即使你被一些dynamic_cast侵扰它,仍然留下大炮应该得到哪个params的问题?

不,主体必须相互合作,或使用一些消息系统(见调度员)......

答案 1 :(得分:1)

每个行为的主体不同的内部变量,并且它们可以使用内部私有/继承变量,因此如果您可以在调用act之前设置这些变量,那么您不需要通过参数发送任何内容为了安全,或没有并发症