每当我在GUIElement对象中调用虚方法时,我都会遇到访问冲突异常。但是,当调用" isFinished()"时,也不例外。
我使用的是Visual Studio 2013。
这是我的代码:
main.cpp的一些代码:
GUIElement* guiElement = NULL;
void init()
{
guiElement = new GUIElement(&b);
}
void draw()
{
if (guiElement == NULL || !(guiElement->hidesScreen())) //Causes the exception
currentScreen->draw();
}
GUIElement.h
#pragma once
class GUIElement
{
public:
GUIElement(bool* ok);
~GUIElement();
bool isFinished();
virtual void update(float deltaMs);
virtual void draw();
virtual bool pausesScreen();
virtual bool hidesScreen();
private:
bool finished;
protected:
virtual void onFinish();
bool* ok;
};
GUIElement.cpp
#include "GUIElement.h"
GUIElement::GUIElement(bool* ok)
{
this->ok = ok;
}
GUIElement::~GUIElement()
{
}
bool GUIElement::isFinished()
{
return finished;
}
void GUIElement::onFinish()
{
finished = true;
}
void GUIElement::update(float deltaMs)
{
}
void GUIElement::draw()
{
}
bool GUIElement::pausesScreen()
{
return false;
}
bool GUIElement::hidesScreen()
{
return false;
}
答案 0 :(得分:2)
当您通过无效指针调用方法时,通常会发生您遇到的问题。虚方法需要v表才能进行调用,虚拟表指针(通常缩写为vptr)存储在您的实例中。因此,您必须指向一个有效的实例,以便调用不会出现未定义的行为(在您的情况下是崩溃!)。
但是,虚拟功能不需要vptr。此外,编译器能够在编译时确定函数。我怀疑在您致电isFinished
时,您会发现this
指针是null
或某个垃圾值。
如果您发布整个main
,我们可以准确找出问题的确切位置。
答案 1 :(得分:0)
可能currentScreen
不是你所期望的那样 - 但很难用那段代码来判断。
答案 2 :(得分:-1)
我认为问题在于以下几行:
if (guiElement == NULL || !(guiElement->hidesScreen()))
1)让guiElement == NULL - >是真的 2)guiElement->任何失败,因为guiElement IS NULL ...
答案 3 :(得分:-1)
自己找到答案。意外删除了guiElement。