我对C ++很新,所以我可能会遗漏一些明显的东西。我承认我并不完全理解对象模型是如何工作的,但我希望我能从这个问题中学到一些东西......
我有一个带有自定义wxFrame
类的简单wxWidgets应用程序。它挂起了一个事件,在该事件处理程序中,我想设置框架的标题。但是,当事件处理程序执行时,调试器会显示SetTitle
函数的地址为0x00000000
,并且我会收到访问冲突异常。
class BrowserFrame : public wxFrame {
public:
BrowserFrame();
void OnChangeTitle(AweChangeTitleEvent& evt);
private:
AweWebView* m_webView;
};
BrowserFrame::BrowserFrame() : wxFrame(NULL, wxID_ANY, wxGetApp().Name) {
m_webView = new AweWebView(this, wxID_ANY);
m_webView->Connect(aweEVT_CHANGE_TITLE, AweChangeTitleEventHandler(BrowserFrame::OnChangeTitle));
m_webView->WebView()->LoadURL(Awesomium::WebURL(Awesomium::WSLit("http://www.google.com")));
}
void BrowserFrame::OnChangeTitle(AweChangeTitleEvent& evt) {
SetTitle(evt.GetTitle()); // SetTitle == 0x00000000, Access violation
}
我的第一个想法是BrowserFrame
以某种方式被破坏了。但是,情况似乎并非如此,因为我可以使用GetEventObject()
访问它。这很好用,例如:
void BrowserFrame::OnChangeTitle(AweChangeTitleEvent& evt) {
static_cast<wxFrame*>(static_cast<wxWindow*>(evt.GetEventObject())->GetParent())->SetTitle(evt.GetTitle());
}
我想不出任何我写的会以任何方式破坏v-table的东西,除了我在图像缓冲区上进行自己的内存管理的一个例子。我已完全删除了该部分但仍然在SetTitle
上获取了访问权限,因此我认为这不是问题的根源。
我错过了什么?
答案 0 :(得分:0)
我设法解决了这个问题。我会尽力解释解决方案。
如果我正确理解了问题,事件处理程序实际上并未与BrowserFrame
的实例相关联。我切换到更现代的Bind<>()
方法来连接wxWidgets事件并将其传递给BrowserFrame
的实例:
m_webView->Bind(aweEVT_CHANGE_TITLE, &BrowserFrame::OnChangeTitle, this);
我还必须更新我的自定义事件声明,使它们与Bind<>()
兼容,但在此之后,SetTitle()
被调用,一切正常。