更改对象数组的每个元素的属性

时间:2020-04-04 17:13:11

标签: c++ arrays class object physics

我有一些概念上的疑问,很简单,但我被困住了。

在模拟银河系的形成过程中,我有一个名为SolarSystem的类。

class SolarSystem
{
private:
    double sPositionX, sVelocityX, sPositionY;
    double  sVelocityY, sMass, sExcentricity;
public:
//Methods like getPosition(), etc
}

在我的主要功能中,我有对象数组SolarSystem systems[1000]。我需要实现一种算法,使太阳系在银河系中运动(遵循牛顿定律),因此,我必须更改阵列每个成员的属性值,例如位置,速度等(N-身体问题)。

  • 我猜想我无法制定更改值的方法 algorithm(),因为系统之间存在相互依赖关系,并且该方法无法考虑向数组的其他成员帐户。
  • 但是,如果我选择在功能中更改属性, 需要将这些信息公开,然后,有没有理由 类?在我的主函数positionX[i], mass[i], etc中将属性作为变量int main()会更容易吗?

2 个答案:

答案 0 :(得分:2)

例如,您可以简单地创建另一个名为“ Galaxy”的类,其中包含您的系统。

#include <vector>
#include <SolarSystem.h>
Galaxy {
   std::vector<SolarSystem> system;
public :
   //construtor and destructor
   void algorithm();
   //some other methods like this :
   void addSolarSystem(SolarSystem& system);
};

最后,在 算法 中,您可以使用SolarSystem类(或方法: accelerate(浮点值)< / em> ,...)。

最好创建另一个类,因为它是现实:银河系包含太阳系,并且该容器(银河系)链接了您的依赖项。此外,您应始终应用“单一责任原则” wiki:您的太阳系不能影响其他系统,而只能影响进入该系统的行星(单一责任)。没有这个原则,当您实现其他事物(彗星...)时,您将遇到一些问题。

通常,最好封装数据和函数。

答案 1 :(得分:0)

类使您可以有意义的方式构造数据,从而提高可扩展性,可维护性并使代码更易于理解。如果您的主要问题是从类访问systems,则可以将其作为参数传递。在现代C ++中,应使用std::vectorstd::array而不是C样式数组。例如:

class SolarSystem
{
private:
    double sPositionX, sVelocityX, sPositionY;
    double  sVelocityY, sMass, sExcentricity;
public:
    // getters and setters and stuff

    void algorithm(const std::vector<SolarSystem> &otherSystems) {
        for(const auto &otherSystem : otherSystems) {
            // iterate through all systems...
        }
    }
}

如果您也将太阳能系统存储在

之类的std::vector
std::vector<SolarSystem> solarSystems; 

您可以遍历它并更新所有这样的系统:

for(auto &system : solarSystems) {
    system.algorithm(solarSystems);
}