我有一些概念上的疑问,很简单,但我被困住了。
在模拟银河系的形成过程中,我有一个名为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()
会更容易吗?答案 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::vector
或std::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);
}