2016-12-13 9 views
0

Я хочу реализовать оператор назначения перемещения для моего класса, который также будет перемещать все мои динамические привязки. Я хорошо работаю, пока не попытаюсь наследовать от wxEvtHandler. Я много играл с ним и не могу найти решение, когда он будет хорошо работать с наследованием от wxEvtHandler. Пожалуйста помоги.Переместить оператор присваивания для класса с динамическими привязками

класс

UI:

class FrameUi : public wxFrame 
{ 
public: 
    FrameUi(wxWindow* parent) 
     : wxFrame(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize) 
    { 
     m_panel = new wxPanel(this); 

     wxBoxSizer* mainS = new wxBoxSizer(wxVERTICAL); 
     m_button = new wxButton(m_panel, wxID_ANY); 
     mainS->Add(m_button, 0, wxALL); 

     m_panel->SetSizer(mainS); 

     wxBoxSizer* m_panelSizer = new wxBoxSizer(wxVERTICAL); 
     m_panelSizer->Add(m_panel, 1, wxEXPAND, 5); 

     SetSizer(m_panelSizer); 
    } 

    wxPanel* m_panel; 
    wxButton* m_button; 
}; 

класс контроллера:

class Frame 
    : public wxEvtHandler // Without inheriting from it, binding work on new object 
{ 
public: 
    Frame() 
     : m_ui(0) 
    { } 

    Frame(wxWindow* parent) 
     : m_ui(new FrameUi(parent)) 
    { 
     m_ui->m_panel->Bind(wxEVT_LEFT_DOWN, &Frame::onLeftDown, this); 
     m_ui->m_button->Bind(wxEVT_BUTTON, &Frame::onButton, this); 
    } 

    Frame(const Frame&) = delete; 
    Frame& operator=(const Frame&) = delete; 

    Frame& operator=(Frame&& rhs) 
    { 
     if (&rhs != this) 
     { 
      m_ui = rhs.m_ui; 
      rhs.m_ui = nullptr; 
     } 
     return *this; 
    } 

    void onLeftDown(wxMouseEvent& event) { wxLogDebug("Left Down"); } 

    void onButton(wxCommandEvent&) { wxLogDebug("Pressed"); } 

    FrameUi* m_ui; 
}; 

Основной класс окна:

class MainWnd : public wxFrame 
{ 
public: 
    MainWnd() 
     : wxFrame(NULL, wxID_ANY, wxEmptyString) 
    { 
     wxBoxSizer* s = new wxBoxSizer(wxVERTICAL); 
     SetSizer(s); 
    } 

    Frame frame; 
}; 

Применение точка входа:

class WxguiApp 
    : public wxApp 
{ 
public: 
    bool OnInit() override 
    { 
     MainWnd* mainWnd = new MainWnd(); 
     mainWnd->Show(); 
     SetTopWindow(mainWnd); 

     mainWnd->frame = Frame(mainWnd); // If comment inheritance from wxEvtHandler, binding will work well 
     mainWnd->frame.m_ui->Show(); 

     return true; 
    } 
}; 

IMPLEMENT_APP(WxguiApp); 
+0

Подходит ли «wxEvtHandler»? – NathanOliver

+2

Отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve). Как мы можем помочь без основного класса? – m8mble

+0

Я не знаю, но похоже, что он повреждает другие привязки к материалу m_ui при наследовании от него. Ничто не было связано с этим. –

ответ

0

wxEvtHandler не движется, поэтому вы не можете сделать класс, полученный из него подвижным. Самое простое решение, конечно, просто не наследуется от него.