Получение ошибки сегмента, проблемы с классами и переменными - PullRequest
0 голосов
/ 30 апреля 2010

Хорошо, так что я все еще изучаю здесь 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

Ответы [ 2 ]

2 голосов
/ 30 апреля 2010

Вы ловите событие в объекте, отличном от объекта RunFrame. Возможно, это происходит в базовом объекте типа wxFrame. Используйте команду времени выполнения wxEvtHandler :: Bind <> (), чтобы связать событие, а не таблицу событий, и должно стать ясно, что происходит.

Чтобы убедиться, что это проблема, сравните адрес вашего объекта RunFrame с указателем «this» в методе OnKey. Дык они разные.

ОБНОВЛЕНИЕ: Покажите нам определение таблицы событий. Вот в чем проблема.

ОБНОВЛЕНИЕ 2: Я должен оставить вас с этим. Может быть, это будет понятнее: ваш обработчик событий определен как принадлежащий RunFrame. Таблица событий (я думаю) связывает событие с другим объектом. В результате RunFrame :: OnKey вызывается не с указателем this для вашего объекта RunFrame, а с некоторым другим объектом, возможно, другого типа. Удачи. Должен идти.

0 голосов
/ 30 апреля 2010

В отладчике проверьте значение функции command в OnKey.

  • Проверьте, указывает ли command на неверная память (по какой-то причине объект команды удаляется)
  • Или, если команда указывает на NULL?
...