1

Fireworksのinit関数を使用して、パーティクルをパーティクルベクトルクラスに格納しました。また、update()関数でパーティクルベクトルの数を取得しようとすると、パーティクルベクトルは空になります。なんで?

Fireworks.cppクラス:

void Fireworks::init(){
    float x = randf();
    float y = - 1 * randf(); //Going UP
    float z = randf();

    Particle part(position,Vector3f(x,y,z), color, randInt(1,50));
    particles.push_back(part);
}

bool Fireworks::update(){
    Particle particle;
    int count = particles.size(); //Total num of particles in system
    cout << particles.size() << " ";
}

class Fireworks: public ParticleSystem {
private:
  void init();

public:

  Fireworks(Vector3f pos, Vector3f col) {
    position = pos;
    color = col;
    init();
  }

  virtual bool update();
};

particlesystem.h

class ParticleSystem {
protected:
  vector<Particle> particles;

public:
  //virtual Particle generateParticle();
  virtual bool update(){return false;};
};

main.cpp

ParticleSystem *PS;
int main( int argc, char *argv[] ) {
  PS = &Fireworks(Vector3f(0,0,0), Vector3f(200,0,255));
  glutIdleFunc(move);
}

void move()
{
   PS->update();       
}
4

1 に答える 1

3
PS = &Fireworks(Vector3f(0,0,0), Vector3f(200,0,255));

これにより、未定義の動作が発生します。右側は一時的なものを作成します。一時的なものは、完全な式が終了するとすぐに(つまり、の直後に;)削除されます。PSその行の後に削除されたオブジェクトを指します-それで何かをすることは未定義の動作です。

を使用しnewます。

PS = new Fireworks(Vector3f(0,0,0), Vector3f(200,0,255));

また、何かを返すと宣言されているすべての関数から戻る必要があります(void以外)それらが仮想であるかどうかは関係ありません。

于 2012-11-10T14:21:10.747 に答える