2016-06-13 14 views
0

私はC++プログラミングの初心者です。これは私の最初のC++プログラムです。私の質問とは別にテクニックを作ったり、不適切な使い方をしたりして、コードの残りの部分を改善することができます。 プログラムはボールが衝突するかどうかをチェックする単純なルーチンです。衝突した場合、両方のボールの速度ベクトルは反対になります。 私が持っている問題は、関数 "checkcollision"がテストボールオブジェクトに更新された速度を書き込むことができないようです。私は距離を計算することができますが、私は変更できません/ testball.xspeedに書き込みます。あなたはこれの理由を知っていますか?C++関数はオブジェクトへの書き込みができません

私の他の質問は次のとおりです。位置と速度の値をベクトルとして導入したいと考えました。したがって、私はベクトルクラスを作成しました。しかし、ボールクラスでこのタイプの変数を使用することはできませんでした。 どのようにベクトルオブジェクトを作成し、ボールクラスでこのオブジェクトを使用できますか?

ありがとうございました!

class vector { 
public: 
    float x; 
    float y; 
    vector(float x_,float y_){ 
     x=x_; 
     y=y_; 
    } 
}; 


class ball { 
public: 
    // vector position; // doesnt work 
    // vector speed; 
    float x; 
    float y; 
    float xspeed; 
    float yspeed; 
    ball(float x_,float y_,float xspeed_,float yspeed_){ 
     x=x_; 
     y=y_; 
     xspeed=xspeed_; 
     yspeed=yspeed_; 
    } 

}; 

void checkcollision(ball testball, ball testball2){ 
    float distance; 
    distance=pow(pow(testball.x-testball2.x,2)+pow(testball.y-testball2.y,2),0.5); 
    if (distance<0.1){ 
     testball.xspeed=-testball.xspeed; 
     testball.yspeed=-testball.yspeed; 
     testball2.xspeed=-testball2.xspeed; 
     testball2.yspeed=-testball2.yspeed; 
     } 

    } 

int main(){ 
     float time=0; 
     float timestep=0.1; 
     float runtime=20; 
     int xmax=10; 
     int ymax=15; 

     ball testball(5,5,2,2); // positionx,y, speed x,y 
     ball testball2(4,5,1,2); 

     for(double i = 0; i <runtime; i = i + timestep) 
     { 
      time=time+timestep; 

      checkcollision(testball,testball2); 
      writeFile(testball.x,testball.y,testball2.x,testball2.y,count); 

     } 

    return 0; 
    } 
+5

値渡しのため、関数はコピーを変更するだけです。 – melpomene

+0

ベクトルクラス(パラメータなし)に別のコンストラクタを定義して、クラスメンバとしてここで定義する必要があります。 たとえば、 'vector(){}'です。 –

+1

コードを書くときは、小さくてシンプルなものから始めて、完全に機能してから、少しずつ複雑なものを追加してください。 **動作しないコードには絶対に追加しないでください。**問題の解決を求めるときは、問題を明確に記述してください。 "私はこのタイプの変数を使うことができませんでした"とは、6ダースのことを意味するかもしれません。 – Beta

答えて

1

あなたのチェックコリジョン機能が現在動作している方法は、渡したボールオブジェクトのコピーを作成してコピーを修正することです。機能の終わりに、これらのコピーは範囲外になり、失われます。

目的を達成するための1つの方法は、参照によってパラメータを渡すことです。関数の署名は、次のようになります。

これは、関数が受け取るオブジェクトが、メイン関数で作成されたオブジェクトへの参照に過ぎないことを意味します。

あなたがしようとしていることを達成するには、さまざまな方法があります。これはただのものです。

+0

ありがとう、私は似たようなことを試みましたが、 "&"間違った位置を得ました。 –

+0

もう1つ質問ですが、メイン変数から別の関数にローカル変数を渡すことができますか? checkcollisionからmainへの戻り値は必要ありませんか? ball * testball = mainの新しいボールを使ってメモリを割り当てる方法はどうですか?ポインタを関数に渡しますか? ありがとう! –

関連する問題