所以我有 3 个类(class)。一个主类 ClassA、一个基类 ClassB 和一个继承类 ClassC 一起工作,但是,当我关闭我的程序时,出现“访问冲突写入位置”错误。
这是设置:
A类.h
ClassA
{
public:
ClassA(void) : player_(NULL), bullet_(NULL) {};
~ClassA(void);
void Update();
void fireBullet(int posx, int posy, int speed);
private:
ClassB* player_;
ClassB* bullet_;
};
A 类.cpp
void ClassA::Update()
{
ClassA* pointer = this;
player_->Update(*pointer);
if(bullet_->IsAlive())
bullet_->Update(*pointer);
}
void fireBullet(int posx, int posy, int speed)
{
//make it active, set its position and speed
}
B 类只是基类,所以我只发布 C 类
C类.h
ClassC : public ClassB
{
public:
ClassC() : posx_(0), posy_(0) {};
virtual void Update(ClassA &a);
private:
int posx_;
int posy_;
}
C 类.cpp
void ClassC::Update(ClassA &a)
{
if(spacebar == pressed)
a.fireBullet(posx_, posy_, 10);
}
我觉得我在某处有一个引用错误,但我不知道在哪里。该问题仅在生成子弹时出现,因此如果我在整个程序中不按空格键然后关闭它,程序将正常退出。但是,如果我在运行时按下空格键,则会导致访问冲突错误。我已经检查了ClassA的析构函数,但是问题出现在析构函数中是否有东西。
我试图只显示与问题相关的代码。有一个用于初始化 bullet_ 和 player_ 的初始化函数,但看不到它与问题相关。
析构函数:
A级 A 类::~A 类(无效) { 删除播放器_; 删除项目符号_;
B类和C类
~Class {};
player_ 和 bullet_ 也在 ClassA 的一个函数中被初始化:
ClassA::Initialise()
{
ClassB* player = new ClassC;
player->Initialise();
player_ = player;
ClassB* bullet = new ClassD; //ClassD is also inherited from B
bullet->Initialise();
bullet_ = bullet;
}
最佳答案
我注意到的一个错误是,您在 ClassC::Update(ClassA &a) 中通过引用发送 ClassA,然后将其用作指针。 尝试写
void ClassC::Update(ClassA &a)
{
if(spacebar == pressed)
a.fireBullet(posx_, posy_, 10);
}
此外,请发送您的构造函数、析构函数、对象创建等代码。
关于c++ - 关闭时出现访问冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21637796/