Объявление объекта в своем классе

Я пытаюсь портировать Прыгающие пузыри Обрабатывая пример в C ++ (с OpenFrameworks), я столкнулся с небольшим затруднением. В определении класса:

class Ball {
float x, y;
float diameter;
float vx = 0;
float vy = 0;
int id;
Ball[] others;

...

void collide() {
for (int i = id + 1; i < numBalls; i++) {
float dx = others[i].x - x;
float dy = others[i].y - y;
float distance = sqrt(dx*dx + dy*dy);

...

Похоже, объект «другие» объявляется в своем собственном классе. Я пытался добавить Ball others(<arguments>); в мой класс C ++, но XCode сердито вспыхивает на меня и оставляет консольное сообщение, угрожающее съесть моих будущих детей, поэтому я, должно быть, делаю что-то не так. Я думаю, что это может быть вещь Java / Processing — но я довольно плохо знаком с классами C ++.

Есть ли способ сделать то же самое в C ++ или мне просто лучше переместить функцию collide из класса в класс testApp с некоторыми изменениями?

0

Решение

Вам нужно иметь указатель, а не массив:

...
Ball *others;
...

Вы не можете объявить объект того же типа в определении класса, потому что это будет означать, что вам нужен объект бесконечного размера, который содержит сам себя.

2

Другие решения

Кажется, вам нужен массив объектов, который увеличивается / уменьшается по мере необходимости. В этом случае вы можете использовать вектор Ball указатели:

std::vector<Ball*> others;

Создание нового Ball экземпляры и вставка их в массив работает так:

others.push_back(new Ball);

Однако, в отличие от Java, в C ++ нет сборщика мусора. Поэтому обязательно удалите элементы снова. Например, в деструкторе вашего класса:

for (size_t i = 0; i < others.size(); ++i) {
delete others[i];
}

Или, если вы используете C ++ — 11, более короткая версия использует цикл for на основе диапазона:

for (auto ball : others) {
delete ball;
}
2

это невозможно объявить объект, который является полем своего собственного класса. Потому что, если это происходит, когда вы объявляете объект этого класса, процесс инициализации является рекурсивным вызовом. Это аналогично коду Java, как это

class Test {
Test t = new Test();
}

Приведенный выше код вызовет java.lang.StackOverflowError

0
По вопросам рекламы [email protected]