【问题标题】:Where do I store a function that acts on an array of objects?我在哪里存储作用于对象数组的函数?
【发布时间】:2013-09-17 07:50:55
【问题描述】:

我正在尝试使用 c++ 创建类似以下内容:

我有一个名为 particle 的类,它将存储每个粒子的位置和速度。此外,成员函数将使用速度数据更新粒子的位置。

我也在尝试编写一个函数来检测粒子与盒子边界之间的碰撞。为此,此函数需要访问每个粒子的位置和速度。因此,该函数需要将整个粒子数组作为参数。但是,这个函数不能作为粒子类的成员函数存在,因为那样它就无法访问所有的粒子。

问题:我在哪里包含碰撞检测功能,使其成为粒子类的可扩展部分?

我想过在我的 main.cpp 文件中编写这个函数,但我一点也不知道这是否符合 OOP 准则。理想情况下,可能还有其他函数也作用于粒子数组。

【问题讨论】:

  • 无论什么“拥有”粒子都可能是放置粒子碰撞检测的地方。在这种情况下,无论谁拥有粒子列表并负责管理它们。 (并且 +1 是我长期以来在一个问题中看到的最直接的示例)。
  • 可以通过什么方式扩展? “显而易见”的答案是一个静态成员函数,但它可能取决于这个 particle 类的角色(主要是它是否设计为用作基类),以及您希望如何表示边界框。另请注意,许多 C++ 代码(可能是大多数)以及几乎所有 C++ 标准库的设计没有遵循 OOP 准则。 C++ 允许其他编程范式,而不仅仅是 OOP。
  • GIF 也是一个 +1!

标签: function class simulation particles


【解决方案1】:

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

(这也是您将在数组中运行的代码并调用“Draw”函数的地方。)

【讨论】:

    【解决方案2】:

    我想一个好主意是将检测函数声明为类粒子的朋友:它将可以访问类中的所有成员。然后,您可以在某种管理器函数内循环触发此函数,该函数将计算与数组中所有粒子的碰撞。在这个

    void CollisionMgr(particleClass *ParticleArrayPtr, int NumOfParticles)
    {
       while(NumOfParticles)
    
        {
          CollisionOfParticle(*ParticleArrayPtr, NumOfParticles);
          NumOfParticles--;
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      我倾向于使用以下模式:将所有模型状态保存在一个名为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;
      };
      

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 2015-07-05
        • 1970-01-01
        • 2017-08-23
        • 1970-01-01
        • 2014-04-19
        • 1970-01-01
        相关资源
        最近更新 更多