2017-09-24 6 views
-4

パーティクルシステムを作成しようとしていて、パーティクルオブジェクトを作成して後で使用するためにベクターに格納する必要があります。それを行う 機能は次のとおりです。オブジェクトを作成してベクトルに格納すると値が失われる

void spawnLoop(std::vector<Particle*> &particleVector){ 
    for (int i=0; i < 5; i++) { 
     particleVector.emplace_back(new Particle(400.0, 400.0, 1.0, 1.0)); 
    } 
} 

粒子クラスのコンストラクタは次のようになります。

Particle::Particle(float xPos= 400,float yPos= 400,float xVel= 0,float yVel= 0) { 
float xPosition = xPos; 
float yPosition = yPos; 
float xVelocity = xVel; 
float yVelocity = yVel; 
bool dead = false; 
std::cout<< "We have " << xPosition << " "<< yPosition << " "<< xVelocity << " "<< yVelocity << std::endl; 
//This prints the values and they look correct 
} 

しかし、私は、私はそれを格納するために完了し、正確後にベクトルをループしようとした場合、それは私を与えます値は、1.81063e + 13となります。 私はそれをかなり研究してみましたが、それに対する解決策は見つかりませんでした。 EDIT:

void loopOver(std::vector<Particle*> const vec){ 
for (auto i = vec.begin(); i != vec.end(); i++){ 
    std::cout << "avem " << (*i)->getXPos() << " " << (*i)->getYPos() << std::endl; 
} 
} 
+1

それはあなたに起こっていないのでしょうか? – StoryTeller

+1

'std :: vector >'のように、 'std :: vector 'の使い方に疑問を持たせる必要があります。 'std :: vector ' – UnholySheep

+0

なぜそのベクトルにポインタを格納する必要がありますか?単にそこに普通の 'Particle'インスタンスを格納することはできませんか? – user0042

答えて

2

問題はParticleのコンストラクタです。インスタンス変数ではなく、ローカル変数にパラメータを割り当てています。あなたはこれらの変数の値をプリントアウトしようとするので、後に、それらが保存されていない:

_xPosition = xPos; 
_yPosition = yPos; 
_xVelocity = xVel; 
_yVelocity = yVel; 

float xPosition = xPos; 
float yPosition = yPos; 
float xVelocity = xVel; 
float yVelocity = yVel; 

それはこのようなものでなければなりません:これは問題です

これらの変数はすべて、クラスのインスタンス変数として定義されており、getXPos()などはそれらを返します。

コンストラクタで値を代入するのではなく、初期化リストを初期化する方がよいでしょう。ここでは、初期化リストに関するまともな質問/回答があります:C++ initialization lists for multiple variables

+1

これは実際には_で動作しませんでしたが、フロートを削除するだけで動作します。 –

+0

@Turryアンダースコアはインスタンス変数の命名規則です。あなたは好きなものを呼び出すことができます。 – Eli

関連する問題