2017-01-10 76 views
0

我想銷燬一個wxWindow派生的對象,它很可能受到其容器對象之一的綁定()的影響。根據我的閱讀(以及一些追求奇怪錯誤的先前經驗),我相信我需要延遲對Destroy()的調用,直到事件隊列耗盡之後,否則有可能事件處理程序可能嘗試訪問被銷燬目的。使用CallAfter來調用wxWindow :: Destroy會產生編譯時錯誤

我一直在閱讀說使用CallAfter()來執行對象的Destroy()函數。問題是,如果我叫

obj->CallAfter(&ObjClass::Destroy); 

我得到一個編譯錯誤「C2064術語不計算爲服用0參數的函數」,指向wxAsyncMethodCallEventFunctor ::在WX/event.h執行()函數。對我來說這似乎很奇怪,因爲wxWindow :: Destroy()不帶任何參數;我想也許是實例引用(「obj」)是問題,但是當我嘗試以其他方式將它嵌入到調用中時,出現錯誤,說我有太多參數。

通過一些實驗,我已經能夠通過在我的派生對象中定義一個函數,該函數接受0個參數,並且(顯然極爲重要)返回void而不是bool。它看起來非常像:

void ObjClass::DestroyMe() 
{ 
    this->Destroy(); 
} 

現在,當我使用表達式

obj->CallAfter(&ObjClass::DestroyMe); 

程序編譯並似乎是工作。儘管如此,我討厭這個解決方案,因爲它感覺klunky。

  • 有沒有更好的方法來做到這一點?

  • 我正確地認爲這個問題涉及到bool與void 的返回值嗎?

    • 如果是的話,我可以採用某種類型轉換函數的引用來模擬 無效()函數調用(因爲我不關心布爾值)?
+0

爲什麼不在關閉窗口之前解除綁定()所有這些處理程序,或者在窗口析構函數中更好? – Igor

+0

我不得不深入瞭解事件表以便根據具體情況確定綁定是什麼,這肯定比我已經構建的代碼要多得多;我的目標是降低複雜性。 – TPDMarchHare

回答

1

CallAfter()不指望一個void調用,因爲這將是危險的,如果它拿東西,然後就被丟棄的結果(因爲還有什麼可以把它做什麼呢?),所以你不能把它傳遞Destroy()直。

你的解決方法是好的,但是,當然,在C++ 11你可以把它多用lambda表達式裏面去非常好,CallAfter()更短,更方便,所以平時你只是寫

obj->CallAfter([=]() { this->Destroy(); }); 
+0

謝謝。我認爲我真正需要做的是學習lambda;我從來沒有用過它們(據我所知,當我學習C++時它們不存在),直到現在我從來沒有覺得需要了解它們。 – TPDMarchHare

相關問題