0

バウンシング バブル処理の例を (OpenFrameworks を使用して) C++に移植しようとしていますが、少し問題が発生しました。クラスの定義:

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」が独自のクラス内で宣言されているようです。C++ クラスに追加しようとしまし Ball others(<arguments>);たが、XCode が怒ってフラッシュし、将来の子供を食べると脅迫するコンソール メッセージを残すので、何か間違ったことをしているに違いありません。これは Java/Processing の問題かもしれないと考えていますが、C++ クラスは初めてです。

C ++で同じことを達成する方法はありますか、それとも、衝突関数をクラスから移動して、いくつかの変更を加えてtestAppクラスに移動したほうがよいですか?

4

3 に答える 3

2

配列ではなくポインターが必要です。

...
Ball *others;
...

クラス定義で同じ型のオブジェクトを宣言することはできません。これは、それ自体を含む無限サイズのオブジェクトが必要であることを意味するためです。

于 2012-11-22T06:49:57.703 に答える
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;
}
于 2012-11-22T06:54:26.713 に答える