0

我正在尝试将Bouncing Bubbles Processing 示例移植到 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++ 中完成同样的事情,或者我最好将碰撞函数移出类并通过一些修改进入 testApp 类?

4

3 回答 3

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;
}
于 2012-11-22T06:54:26.713 回答
2

您需要有一个指针而不是一个数组:

...
Ball *others;
...

您不能在类定义中声明相同类型的对象,因为这意味着您需要一个无限大小的对象,一个包含自身的对象。

于 2012-11-22T06:49:57.703 回答
0

不可能声明一个对象是它自己的类的一个字段。因为如果发生这种情况,当您声明该类的对象时,初始化过程就是递归调用。它类似于这样的Java代码

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

上面的代码会导致 java.lang.StackOverflowError

于 2013-09-26T04:24:08.863 回答