@jso2322

Не знаете как можно исправить ошибки на с++?

Написал код в VS, выходит две ошибки:
32 balls = new Ball[n];
73 double m1 = M_PI * balls[i].r * balls[i].r;
Перепробовал все возможные варианты, ничего не помогло (или я не умею читать...).
P.S. Если не составит труда, попрошу исправить.
Код:

#include <iostream>
#include <cmath>

using namespace std;

class Ball {
public:
    double x, y;    // координаты центра шарика
    double r;       // радиус шарика
    double vx, vy;  // скорость шарика

    Ball(double ix, double iy, double ir, double ivx, double ivy) {
        x = ix;
        y = iy;
        r = ir;
        vx = ivx;
        vy = ivy;
    }
};

class Game {
public:
    Ball* balls;    // массив объектов Ball
    int nBalls;     // количество шаров в игре
    double width, height;   // размеры игрового поля

    Game(int n, double w, double h) {
        nBalls = n;
        width = w;
        height = h;
        balls = new Ball[n];
    }

    ~Game() {
        delete[] balls;
    }

    void update(double dt) {
        // обновляем положение каждого шарика
        for (int i = 0; i < nBalls; i++) {
            balls[i].x += balls[i].vx * dt;
            balls[i].y += balls[i].vy * dt;

            // проверяем, не вышел ли шарик за границы поля
            if (balls[i].x - balls[i].r < 0 || balls[i].x + balls[i].r > width) {
                balls[i].vx *= -1;
            }
            if (balls[i].y - balls[i].r < 0 || balls[i].y + balls[i].r > height) {
                balls[i].vy *= -1;
            }
        }

        // проверяем столкновения шариков
        for (int i = 0; i < nBalls; i++) {
            for (int j = i + 1; j < nBalls; j++) {
                double dx = balls[i].x - balls[j].x;
                double dy = balls[i].y - balls[j].y;
                double dist = sqrt(dx * dx + dy * dy);   // расстояние между шариками

                // если шарики пересеклись
                if (dist < balls[i].r + balls[j].r) {
                    double nx = dx / dist;  // нормаль к точке столкновения
                    double ny = dy / dist;

                    // проекции скоростей на нормаль и касательную к точке столкновения
                    double v1n = balls[i].vx * nx + balls[i].vy * ny;
                    double v1t = -balls[i].vx * ny + balls[i].vy * nx;
                    double v2n = balls[j].vx * nx + balls[j].vy * ny;
                    double v2t = -balls[j].vx * ny + balls[j].vy * nx;

                    // вычисляем новые скорости
                    double m1 = M_PI * balls[i].r * balls[i].r;
                    double m2 = M_PI * balls[j].r * balls[j].r;
                    double v1nf = ((m1 - m2) * v1n + 2 * m2 * v2n) / (m1 + m2);
                    double v2nf = ((m2 - m1) * v2n + 2 * m1 * v1n) / (m1 + m2);

                    // возвращаем скорости в декартовы координаты
                    double v1nfx = v1nf * nx;
                    double v1nfy = v1nf * ny;
                    double v1tx = v1t * (-ny);
                    double v1ty = v1t * nx;
                    double v2nfx = v2nf * nx;
                    double v2nfy = v2nf * ny;
                    double v2tx = v2t * (-ny);
                    double v2ty = v2t * nx;

                    // обновляем скорости шариков
                    balls[i].vx = v1nfx + v1tx;
                    balls[i].vy = v1nfy + v1ty;
                    balls[j].vx = v2nfx + v2tx;
                    balls[j].vy = v2nfy + v2ty;
                }
            }
        }
    }
};

int main() {
    // создаем игру
    Game game(3, 100, 100);
    game.balls[0] = Ball(20, 20, 5, 30, 40);
    game.balls[1] = Ball(40, 40, 4, -20, 50);
    game.balls[2] = Ball(60, 60, 3, -20, -30);

    // симулируем движение шаров
    double t = 0;
    double dt = 0.01;
    while (t < 10) {
        game.update(dt);
        t += dt;
    }

    // выводим координаты шариков
    for (int i = 0; i < game.nBalls; i++) {
        cout << "Ball " << i << ": (" << game.balls[i].x << ", " << game.balls[i].y << ")" << endl;
    }

    return 0;
}
  • Вопрос задан
  • 130 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вам надо описать конструктор Ball без параметров. Например:
Ball() x(0), y(0), r(0), vx(0), vy(0) {}

Потому что new Ball[n] Создает n объектов, но конструктора по умолчанию (без параметров) у класса Ball нет. Обычно его генерирует компилятор сам, но только если вы не указали никаких своих конструкторов. А new не знает, какие числа передавать в качестве x, y, r и т.д.

Смотрите правило трех.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы