2012-11-22 123 views
0

我试图将Bouncing Bubbles处理示例移植到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); 

... 

它看起来像对象“others”正在其自己的类中声明。我已经尝试将Ball others(<arguments>);添加到我的C++类中,但是XCode愤怒地在我身上闪烁,并留下一个控制台消息,威胁要吃掉我未来的孩子,所以我必须做出错误的事情。我在想这可能是一个Java/Processing的东西 - 但我对C++类很新颖。

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

回答

2

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

... 
Ball *others; 
... 

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

+0

谢谢!因为我需要一个对象数组,所以我最终使用了Ball **。现在代码工作正常,尽管物理不太好,但现在已经足够了! – superkittens

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; 
} 
+0

我认为这是最好的解决方案。在基本上是Java语法的Processing中,当你有一个类似于它自己的类的数组时,它就像一个可调整大小的指向其他Ball对象或实例的“指针”数组。你真的没有Java或Java语法中的指针,这可能会令人困惑。您也可能遇到以相同方式使用的ArrayList。指向C++中其他对象的向量是最好的方法。 – JAMESSTONEco

+0

我同意,尤其是在垃圾收集方面,我应该决定在运行时添加或删除更多的球。 – superkittens

0

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

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

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