使用 CallAfter 调用 wxWindow::Destroy 会产生编译时错误

Using CallAfter to call wxWindow::Destroy generates compile-time error

我正在尝试销毁一个 wxWindow 派生对象,该对象可能已从其容器对象之一受到 Bind() 的影响。根据我的阅读(以及之前处理奇怪错误的一些经验),我相信我需要将对 Destroy() 的调用延迟到事件队列耗尽之后,否则事件处理程序可能会尝试访问已销毁的对象。

我读到的是使用 CallAfter() 来执行对象的 Destroy() 函数。问题是,如果我调用

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

我得到一个编译错误 "C2064 term does not evaluate to a function taking 0 arguments",指向 wx/event.h 中的 wxAsyncMethodCallEventFunctor::Execute() 函数。这对我来说似乎很奇怪,因为 wxWindow::Destroy() 没有参数;我认为可能实例引用 ("obj") 是问题所在,但是当我尝试以其他方式将其嵌入到调用中时,我收到错误消息说我的参数太多。

通过一些实验,我已经能够通过在我的派生对象中定义一个函数来使其工作,该函数接受 0 个参数并且(显然是关键的)returns void 而不是 bool . 很像:

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

现在,当我使用表达式时

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

程序可以编译并且似乎可以运行。尽管如此,我还是讨厌这个解决方案,因为它感觉笨拙。

CallAfter() 确实期望 void 可调用,因为如果它采取任何东西然后丢弃结果将是危险的(因为它还能用它做什么?),所以你可以'不要直接传递它Destroy()

您的解决方法很好,但是,当然,在 C++11 中,您可以通过使用与 CallAfter() 配合得很好的 lambda 来使其更短、更方便,所以通常您只需编写

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