使用多个类使用的容器类进行设计选择

时间:2009-12-05 23:04:49

标签: c++

我有一个类包含一个名为ExplosionGroup的列表(以前称为AllExplosions,原因我将解释),这是一个'Explosion'(另一个类)的列表。

我最初的设计选择,以及运行了一段时间,是在“Level”类中有一个ExplosionGroup,它运行所有级别。任何具有导致它们爆炸的函数的类(如船只或老板)都会将此ExplosionGroup传递给这些函数。所以基本上,Level的ExplosionGroup吸收了所有创造的爆炸(因此它被称为AllExplosions)。

void Foo::Explode( AllExplosions &explosions ) {
  ...// Create the explosion
  explosions.Add( newExplosions );
}

最近我遇到了一个问题,这个解决方案不起作用,因为我需要在其中一个函数之外创建一个爆炸,而只是把代码放在那些函数中a)没有任何意义,b)不能正常工作

因此,我想出让每个爆炸的类都拥有自己的爆炸组。这将允许类处理他们想要的爆炸,而不仅仅是在传递ExplosionGroup的函数中。然后我为ExplosionGroup编写了一个TakeExplosions函数(它只使用了std :: list的splice),它接受了ExplosionGroup参数并从该组中吸取了所有爆炸。 Level将与每个类的ExplosionGroup的访问器一起使用。

void Foo::TakeExplosions( ExplosionGroup &explosions ) {
  m_Explosions.splice( m_Explosions.end(), explosions );
}

我认为这很棒,但我意识到如果我使用这种技术,我会想要将它用于所有可以爆炸以保持一致的类。但是,有一些特殊情况我需要间接地这样做才能使爆炸升级到Level的爆炸。例如,Boss类包含BlockWall(块列表),并且块会爆炸。

因此,挡墙将需要从其挡块中提取爆炸,老板需要从挡墙中提取爆炸,并且水平将需要从Boss中提取爆炸(除非我提供了Boss的存取物'墙,我无意做。)

我真的不想使用全球容器进行爆炸,所以所有的类都可以随意添加爆炸,并完成它,所以我要求对此问题提出任何建议或想法。我还考虑过在Level类中放弃处理爆炸并让每个类完全独立处理,但这对我来说似乎是一个糟糕的抽象。

someBlockWall.ShowExplosions( p_Buffer );
playerShip.ShowExplosions( p_Buffer );
// etc. Seems ugly?

P.S。我知道在不知道游戏中的动画是如何工作的情况下很难回答这样的问题等等。我也很想使用全局容器,因为我有点担心所有这些与列表一起玩都会产生性能影响。但是,我没有做过任何剖析,所以我甚至都不去考虑它。

1 个答案:

答案 0 :(得分:1)

我没有答案,只有一些问题可以帮助其他人(也可能是你自己)找到一个好的答案。

  1. 为了展示爆炸,必须执行哪些具体步骤?
  2. 这里的不变量是什么? (例如,所有爆炸都是相同的,是对象特定的,取决于级别上的时间或位置)
  3. 显示爆炸(渲染器,时钟,可爆炸物体等)涉及哪些物体?
  4. 有许多可能的解决方案,但在不了解所有相关力量的情况下很难选择。