我正在尝试销毁一个wxWindow派生的对象,该对象可能已经从其容器对象之一受到Bind()的约束。根据我的阅读(以及一些追逐奇怪错误的经验),我相信我需要延迟调用Destroy()直到事件队列耗尽为止,否则事件处理程序可能会尝试访问被破坏的对象
我一直在阅读的内容是使用CallAfter()来执行对象的Destroy()函数。问题是,如果我打电话
obj->CallAfter(&ObjClass::Destroy);
我得到一个编译错误“C2064术语不计算为带0参数的函数”,指向wx / event.h中的wxAsyncMethodCallEventFunctor :: Execute()函数。这看起来很奇怪,因为wxWindow :: Destroy()不带参数;我想也许实例引用(“obj”)就是问题所在,但是当我试图将其用于其他方式的调用时,我得到的错误是我有太多的参数。
通过一些实验,我已经能够通过在我的派生对象中定义一个函数来使它工作,该函数接受0个参数和(显然很关键)返回void而不是bool。它看起来非常多像:
void ObjClass::DestroyMe()
{
this->Destroy();
}
现在,当我使用表达式
时obj->CallAfter(&ObjClass::DestroyMe);
程序编译并且似乎正在运行。不过,我讨厌这个解决方案,因为它感觉很笨拙。
有更好的方法吗?
我认为这个问题与bool vs. void有关 返回值?
答案 0 :(得分:1)
CallAfter()
确实期望一个void
可调用,因为如果它采取了任何东西然后只是丢弃了结果(因为它还能用它做什么呢?)会很危险,所以你可以'} t直接传递Destroy()
。
你的解决方法很好但是,当然,在C ++ 11中你可以通过使用与CallAfter()
非常匹配的lambdas来缩短和更方便,所以通常你只需要写< / p>
obj->CallAfter([=]() { this->Destroy(); });