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