在其类中声明对象

Declaring an object within its class

本文关键字:声明 对象      更新时间:2023-10-16

我正在尝试将弹跳气泡处理示例移植到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/处理的事情 - 但我对C++类很陌生。

有没有办法在C++中完成同样的事情,或者我只是最好通过一些修改将碰撞函数移出类并进入 testApp 类?

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

...
Ball *others;
...

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

似乎您想要一个根据需要增长/收缩的对象数组。在这种情况下,您可以使用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;
}

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

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

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