Изменение атрибутов каждого элемента массива объектов - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть некоторые концептуальные сомнения, извините, если они простые, но я застрял.

В симуляции формирования галактики у меня есть класс под названием SolarSystem.

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

В моей основной функции у меня есть массив объектов SolarSystem systems[1000]. Мне нужно реализовать алгоритм, чтобы заставить солнечные системы двигаться в моей галактике (следуя l aws Ньютона), и, таким образом, я должен изменить значения атрибутов каждого члена массива, такие как положение, скорость и т. Д. c. (Проблема N-тела).

  • Я полагаю, что я не могу сделать метод algorithm(), который изменяет значения, потому что существует зависимость систем с каждым other, и метод не может принимать во внимание другие члены массива.
  • Однако, если бы я решил изменить атрибуты в функции , мне нужно, чтобы они были опубликованы c, а потом, есть ли причина делать урок? Не было бы проще иметь атрибуты в качестве переменных positionX[i], mass[i], etc в моей основной функции int main()?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Вы можете просто создать другой класс под названием "Галактика", например, содержащий ваши системы.

#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 (или методами: ускорение (значение с плавающей запятой) , ...).

Лучше создать другой класс потому что это реальность: галактика содержит солнечные системы, и этот контейнер (галактика) связывает ваши зависимости. Более того, вы всегда должны применять «принцип единой ответственности» wiki : ваша солнечная система не может влиять на другие системы, а только на планеты в этой системе (единственная ответственность). Без этого принципа у вас будут некоторые проблемы, когда вы будете реализовывать другие вещи (кометы ...).

Обычно лучше инкапсулировать ваши данные и функции.

0 голосов
/ 04 апреля 2020

Классы позволяют структурировать ваши данные осмысленным образом, улучшая расширяемость, удобство обслуживания и облегчая понимание кода. Если вашей основной проблемой является доступ к systems из класса, вы можете просто передать его в качестве параметра. В современном C ++ вы должны использовать std::vector или std::array вместо C -style-arrays. Например:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...