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

时间:2017-01-10 00:21:16

标签: c++ wxwidgets

我正在尝试销毁一个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有关 返回值?

    • 如果是这样,我可以以某种方式对函数引用进行类型转换来模拟a void()函数调用(因为我不关心bool值)?

1 个答案:

答案 0 :(得分:1)

CallAfter()确实期望一个void可调用,因为如果它采取了任何东西然后只是丢弃了结果(因为它还能用它做什么呢?)会很危险,所以你可以'} t直接传递Destroy()

你的解决方法很好但是,当然,在C ++ 11中你可以通过使用与CallAfter()非常匹配的lambdas来缩短和更方便,所以通常你只需要写< / p>

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