2011-02-09 9 views
1

私はこのコードを持っている:更新が呼び出されたときに、私はAddForceを呼び出すと1の強さと無限の力を作るとき、今 std :: vectorはデータを保持していませんか?


void BaseOBJ::update(BaseOBJ* surround[3][3]) 
{ 
    forces[0]->Apply(); //in place of for loop 
    cout << forces[0]->GetStrength() << endl; //forces is an std::vector of Force* 
}

void BaseOBJ::AddForce(float str, int newdir, int lifet, float lifelength) {

Force newforce; 
newforce.Init(draw, str, newdir, lifet, lifelength); 
forces.insert(forces.end(), &newforce); 
cout << forces[0]->GetStrength(); 

}

を、それはしかし、それだけで0を出力COUTの1あたかもその力がもはや存在しないかのように。

答えて

4

ベクトルに強制するポインタを格納していますが、強制は関数ローカルです。

ヒープ上に作成するには、newを使用する必要があります。

Force* f = new Force; 
forces.push_back(f); 
+0

ありがとう、魅力的なように働いた! +1 – Chris

+2

+1また、終了時にベクターの各要素に対してdeleteを呼び出すことを忘れないでください。 –

+1

@Chris: 'delete'を呼び出すことを忘れないでください。さらに良い方法は、 'boost :: ptr_vector'(http://www.boost.org/doc/libs/1_45_0/libs/ptr_container/doc/ptr_vector.html)です。 –

3

は、あなたが新しいとあなたのフォースを作成する必要があります:あなたは機能を残し、他の何かをした後、あなたのコードで何が起こる

Force *newforce = new Force; 
newforce->Init(draw, str, newdir, lifet, lifelength); 
forces.insert(forces.end(), newforce); // or: forces.push_back(force); 

は、あなたのオブジェクトがスタック上に残っているということです、それは上書きされます。

なぜポインタのベクトルですか?おそらく、Force *ではなくForceのベクトルが必要です。あなたはまた、あなたがそれを放棄する前に、あなたのベクトルのすべての要素を削除する必要があります!

関連する問題