2017-01-10 63 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

相关问题