2012-11-22 130 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的