所以我有这个:
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 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;
};
答案 0 :(得分:6)
这是因为您在push_back
电话中创建了临时对象。只要push_back
函数不再返回该对象,就会留下一个悬空指针。
您必须使用new
来创建新对象:
activeEnemies.push_back(new Spikey(_sceneManager, Ogre::Vector3(8,0,0)));
答案 1 :(得分:2)
更改
activeEnemies.push_back( (EnemyInterface*) &Spikey(_sceneManager, Ogre::Vector3(8,0,0)) );
到
activeEnemies.push_back( new Spikey(_sceneManager, Ogre::Vector3(8,0,0)) );
这是正确的电话
(*it)->update(timeSinceLastFrame);
您的vector
包含EnemyInterface*
。
所以*it
给你EnemyInterface*
- 即指向EnemyInterface的指针。您可以使用->