我想销毁一个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 的返回值吗?
- 如果是的话,我可以采用某种类型转换函数的引用来模拟 无效()函数调用(因为我不关心布尔值)?
为什么不在关闭窗口之前解除绑定()所有这些处理程序,或者在窗口析构函数中更好? – Igor
我不得不深入了解事件表以便根据具体情况确定绑定是什么,这肯定比我已经构建的代码要多得多;我的目标是降低复杂性。 – TPDMarchHare