我应该把作用于对象数组的函数存储在哪里?

3
我正在尝试使用C++创建类似以下内容的东西:
我有一个名为particle的类,它将存储每个粒子的位置和速度。此外,一个成员函数将使用速度数据更新粒子的位置。
我还尝试编写一个函数,用于检测粒子与盒子边界之间的碰撞。为此,该函数需要访问每个粒子的位置和速度。因此,该函数需要将整个粒子数组作为参数。但是,该函数不能作为粒子类的成员函数存在,因为它将无法访问所有粒子。
问题:在哪里包括碰撞检测函数,以使其成为粒子类的可扩展部分?
我考虑只是将此函数编写在main.cpp文件中,但我不知道这是否符合面向对象编程准则。理想情况下可能会有其他函数也作用于粒子数组。

1
无论是谁“拥有”这些粒子,都很可能是放置粒子碰撞检测的地方。在这种情况下,就是拥有粒子列表并负责管理它们的任何人。 (加一分,对于最具攻击性的示例,这是我在问题中看到的时间最长的东西)。 - WhozCraig
可扩展的方式是什么?“显而易见”的答案是静态成员函数,但这可能取决于particle类的角色(主要是它是否设计用作基类)以及您想要表示边界框的方式。还要注意,很多C++代码(也许大部分),几乎所有的C++标准库都是设计时不遵循面向对象编程指南的。C++允许使用除OOP之外的其他编程范例。 - Steve Jessop
还有一个加一的GIF! - Keith
3个回答

0

我倾向于使用以下模式:将所有的数据模型状态保存在名为ModelEnvironment的单一类中;拥有一个独立的Renderer类,该类知道如何绘制模型状态;有一个System类将它们联系在一起。以下内容高度概括,但希望能传达这个想法:

class Box {};

class Location {};

class Particle
{
public:
    void updatePosition(double dt);
    const Location& getLocation();
};

class Environment
{
public:
    void checkForCollisions();
private:
    Box box;
    std::vector<Particle> particles;
};

class Renderer
{
public:
    void render(Environment& environment);
};

class System
{
    Environment environment;
    Renderer renderer;
};

0
我想一个好的方法是将检测函数声明为粒子类的友元:它将可以访问类中的所有成员。然后,您可以在某种管理函数内循环触发此函数,该函数将计算数组中所有粒子的碰撞。在这个过程中,您可以使用一些优化技巧来避免重复计算和提高性能。
void CollisionMgr(particleClass *ParticleArrayPtr, int NumOfParticles)
{
   while(NumOfParticles)

    {
      CollisionOfParticle(*ParticleArrayPtr, NumOfParticles);
      NumOfParticles--;
    }

}

0

你可能需要的是一种“ParticleContainer”对象,它保存粒子数组,并对整个粒子系统执行操作。

(这也是你应该放置运行数组并调用“Draw”函数的代码的地方。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接