我得到一個未處理的異常讀取位置0x00000008下面的注意的行(讀取NULL值),導致該錯誤相關的方法包括:(繼續下面的示例):未處理的異常是由於類切片
事件方法:
Event::Event(Event::EVENTTYPE type) : eventType(type) { }
KeyEvent的方法:
class KeyboardKeyEvent : public Event {
public:
//...
int GetKey() const;
protected:
//...
};
int KeyboardKeyEvent::GetKey() const {
return this->_scancode; //Errors out here. "this" returns 0x000000
}
KeyboardKeyEvent::KeyboardKeyEvent(int key, Event::EVENTTYPE type) : Event(type), _scancode(key) { }
KeyDownEvent方法:
種KeyboardKeyDownEvent::KeyboardKeyDownEvent(int scancode) : KeyboardKeyEvent(scancode, Event::KEYBOARD_KEYDOWN) { }
事件處理方法:
bool EventHandler::EnqueueEvent(Event* event) {
if(event == NULL) return false;
try {
this->_eventQueue.push(event);
} catch (...) {
return false;
}
return true;
}
Event* EventHandler::DequeueEvent() {
if(this->_eventQueue.empty() == false) {
Event* result = new Event(*this->_eventQueue.front());
delete this->_eventQueue.front();
this->_eventQueue.pop();
return result;
}
return NULL;
}
主循環順序:
if(_eh->HasEvents()) {
Event* nxtEvent = _eh->DequeueEvent();
switch(nxtEvent->GetType()) {
case Event::KEYBOARD_KEYDOWN:
allegro_message("You pressed the %d key!", dynamic_cast<KeyboardKeyDownEvent*>(nxtEvent)->GetKey());
break;
default:
/* DO NOTHING */;
}
delete nxtEvent;
nxtEvent = NULL;
}
我知道這是一個分層的問題,我只是不明白爲什麼它的發生或如何解決它(實際上,現在我想到了,它可能是「無法轉換爲請求的類型」錯誤)。所有貫穿整個程序_scancode
的步驟是合適的值,但第二行dynamic_cast<KeyboardKeyDownEvent*>(nxtEvent)->GetKey()
運行它會引發錯誤。雙重鑄造爲dynamic_cast<KeyboardKeyDownEvent*>(dynamic_cast<KeyboardKeyEvent*>(nxtEvent))->GetKey()
失敗,並具有相同的錯誤。
編輯:
一些調整後,該變種完美的作品:
if(_eh->HasEvents()) {
switch(_eh->PeekEvent()->GetType()) {
case Event::KEYBOARD_KEYDOWN:
allegro_message("You pressed the %s key!", scancode_to_name(dynamic_cast<KeyboardKeyDownEvent*>(_eh->PeekEvent())->GetKey()));
break;
case Event::MOUSE_BUTTONDOWN:{
Mouse::BUTTONS btn = dynamic_cast<MouseButtonDownEvent*>(_eh->PeekEvent())->GetButton();
if(btn == Mouse::BUTTON2) {
allegro_message("You pressed the %d button!", dynamic_cast<MouseButtonDownEvent*>(_eh->PeekEvent())->GetButton());
}
}
break;
default:
/* DO NOTHING */;
}
}
這不能成爲你真正的代碼。 GetKey的原型和你的定義不匹配。這不應該編譯。 – pmr
這是複製/粘貼/編輯過程中的拼寫錯誤。固定。 – Casey