2016-12-13 2 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は移動不可能なので、移動可能クラスから派生させることはできません。もっとも簡単な解決法はもちろん、それを継承しないことです。

関連する問題