在其类中声明一个对象

时间:2012-11-22 06:46:12

标签: c++ processing openframeworks

我正在尝试将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类并进行一些修改?

3 个答案:

答案 0 :(得分:2)

你需要一个指针,而不是一个数组:

...
Ball *others;
...

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

答案 1 :(得分: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 :(得分:0)

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

这样的Java代码
class Test {
Test t = new Test();
} 

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

相关问题