0

だから私はこれを持っています:

std::vector<EnemyInterface*> _activeEnemies;

EnemyInterface は次のようになります。

#include "Ogre.h"

class EnemyInterface{
public:
  virtual void update(const Ogre::Real deltaTime) = 0;
  virtual void takeDamage(const int amountOfDamage, const int typeOfDamage) = 0;
  virtual Ogre::Sphere getWorldBoundingSphere() const = 0;
  virtual ~EnemyInterface(){} 
};

新しい敵を作成します。

// Spikey implements EnemyInterface
activeEnemies.push_back( (EnemyInterface*) &Spikey(_sceneManager, Ogre::Vector3(8,0,0)) );

そして、すべての敵で update 関数を呼び出したいのですが、クラッシュします:

// update enemies
for (std::vector<EnemyInterface*>::iterator it=_activeEnemies.begin(); it!=_activeEnemies.end(); ++it){
        (**it).update(timeSinceLastFrame); // Option 1: access violation reading location 0xcccccccc
        (*it)->update(timeSinceLastFrame); // Option 2: access violation reading location0xcccccccc
    }

画面に敵が見えますが、アクセスできません。どんな助けでも大歓迎です。

Spikey.h は次のようになります。

#include "EnemyInterface.h"

class Spikey: virtual public EnemyInterface{
private:
int thisID;
static int ID;

Ogre::SceneNode* _node;
Ogre::Entity* _entity;
public:
Spikey(Ogre::SceneManager* sceneManager, const Ogre::Vector3 spawnPos);

// interface implementation
virtual void update(const Ogre::Real deltaTime);
virtual void takeDamage(const int amountOfDamage, const int typeOfDamage);
virtual Ogre::Sphere getWorldBoundingSphere() const;
};
4

2 に答える 2

6

これは、呼び出しで一時オブジェクトを作成するためです。push_back関数がそのオブジェクトを返すとすぐに、push_backそのオブジェクトはなくなり、ダングリング ポインターが残ります。

new代わりに次を使用して新しいオブジェクトを作成する必要があります。

activeEnemies.push_back(new Spikey(_sceneManager, Ogre::Vector3(8,0,0)));
于 2013-04-15T15:02:18.780 に答える