这是一个关于如何实现我最近遇到的一些需求的问题.我相信这有一个模式或共同的解决方案,即使我已经有一个,我渴望了解更多.
假设我正在一个游戏中工作,其中与游戏本身相关的所有实体都来自一个类"演员"(比如"障碍物","移动障碍物","射弹"和"大炮").在游戏中,所有这些实体都存储在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++;
}
Run Code Online (Sandbox Code Playgroud)
让他们都"行动".好吧,到目前为止一切都那么好......事实是,Cannon :: act可能有不同的原型或返回值(例如,存储生成的射弹和推进器将其推入矢量)并且这个"小"差异打破一切.
现在,我知道从某些角度来看,这些方法的重载都是完全不同的功能.我也知道,人们总是可以提前计划并以足够的远见来解决问题...或者可以解决问题.
在这种情况下,我只是为每个派生的Actor类使用了不同的唯一标识符,并使用它们转换为通信类并围绕它们进行工作.我相信我会再次遇到同样的问题,我很想知道一些入门级解决方案.
在此先感谢您的时间.
开始是好的,你在这里脱轨:
问题是,Cannon::act 可以有不同的原型或返回值(例如,存储生成的射弹并将其推入向量中)
为什么会这样?行动就是行动。个体必须在没有任何其他东西的情况下弄清楚它。您应该在执行之前在 ctor 或其他调用中对其进行训练。或者它应该在 Act 调用期间环顾四周。
考虑一下:即使你神奇地准备好了不同参数的有效负载,在引用的 while 中它是如何计算出来的?这个调用是抽象的。即使你用一些dynamic_cast感染它,仍然会留下哪个大炮应该获得哪些参数的问题?
不,受试者必须相互合作,或者使用某种消息系统(参见调度员)......