好的,所以我还在这里学习C ++的知识,所以如果这是一个简单的错误,我会道歉。
我有这堂课:
class RunFrame : public wxFrame {
public:
RunFrame();
void OnKey(wxKeyEvent& keyEvent);
private:
// Configuration variables.
const wxString *title;
const wxPoint *origin;
const wxSize *size;
const wxColour *background;
const wxColour *foreground;
const wxString *placeholder;
// Control variables.
wxTextCtrl *command;
// Event table.
DECLARE_EVENT_TABLE()
};
...然后在OnKey方法中我有这段代码:
void RunFrame::OnKey(wxKeyEvent& keyEvent) {
// Take the key and process it.
if(WXK_RETURN == keyEvent.GetKeyCode()) {
bool empty = command -> IsEmpty();
}
// Propogate the event through.
keyEvent.Skip();
}
...但是我的程序在到达我尝试从命令变量调用IsEmpty方法的行时会出现段错误。我的问题是,“为什么?”在RunFrame类的构造函数中,我似乎可以像在OnKey方法中那样调用命令变量的方法...并且它正确编译,它只是在我尝试执行该行时对我的错误进行了分析
如果需要,以下是构造函数的代码:
RunFrame::RunFrame() :
wxFrame(NULL, wxID_ANY, wxT("DEFAULT"), wxDefaultPosition, wxDefaultSize, wxBORDER_NONE) {
// Create the styling constants.
title = new wxString(wxT("RUN"));
origin = new wxPoint(0, 0);
size = new wxSize(250, 25);
background = new wxColour(33, 33, 33);
foreground = new wxColour(255, 255, 255);
placeholder = new wxString(wxT("command"));
// Set the styling for the frame.
this -> SetTitle(*title);
this -> SetSize(*size);
// Create the panel and attach the TextControl to it.
wxPanel *panel = new wxPanel(this, wxID_ANY, *origin, *size, wxBORDER_NONE);
// Create the text control and attach it to the panel.
command = new wxTextCtrl(panel, wxID_ANY, *placeholder, *origin, *size);
// Set the styling for the text control.
command -> SetBackgroundColour(*background);
command -> SetForegroundColour(*foreground);
// Connect the key event to the text control.
command -> Connect(wxEVT_CHAR, wxKeyEventHandler(RunFrame::OnKey));
// Set the focus to the command box.
command -> SetFocus();
}
预先感谢您提供任何帮助!
此致 celestialorb
答案 0 :(得分:2)
您正在RunFrame对象以外的对象中捕获事件。可能它被捕获在wxFrame类型的基础对象中。使用运行时命令wxEvtHandler :: Bind<>()绑定事件而不是事件表,它应该变得清楚发生了什么。
要验证这是否是问题,请将RunFrame对象的地址与OnKey方法中的“this”指针进行比较。 Betcha他们是不同的。
更新:向我们展示您的事件表定义。这就是问题所在。
更新2:我必须离开你。也许这会更清楚:您的事件处理程序被定义为属于RunFrame。事件表(我认为)将事件绑定到另一个对象。结果是RunFrame :: OnKey不是用你的RunFrame对象的this-pointer调用的,而是一些其他对象,可能是不同类型的。祝好运。得走了。
答案 1 :(得分:0)
在调试器中,检查command
函数中OnKey
的值。
command
是否指向
内存无效(由于某种原因
命令对象被删除)