0

我正在制作一个 MVC 应用程序,我正在寻找的是某种方式来触发某种信号或事件,让它“冒泡”到更高级别的视图类,并得到处理。这种“冒泡”和处理的行为与异常的抛出和捕获完全一样,除非显然在“抛出”事件时不会停止执行,就像发生异常一样。

C++ 中是否存在这样的东西?

我背后的理由是,较低级别的模型类不需要知道任何关于视图的信息就可以工作。我不想将函数/对象指针传递给到处的视图。

编辑:我可能应该补充一点,我的应用程序使用标准 C++,所以还没有 QT,尽管我可能会尝试将它链接到 QT GUI。在模型类中包含 QT 特定代码和标准 C++ 是否明智?

4

1 回答 1

0

您正在寻找的是可重新启动的异常。这些不是在 C++ 中实现的。在 C++ 中,对异常处理程序的搜索在搜索时执行展开,因此在找到处理程序时,该处理程序和抛出站点之间的所有信息都已被丢弃,因此无法返回到抛出站点。

Common Lisp 有可重新启动的异常(它们被称为条件,而不是被“抛出”,而是“发出信号”)。当发出条件信号时,将通过动态上下文搜索处理程序。处理程序使用类型层次结构标识,与 C++ 和其他语言非常相似。但当时并没有平仓。条件处理程序(由它们自己,或与重新启动处理程序合作)确定执行将在哪里继续。这非常有用,因为它允许较低级别的代码从情况中恢复,而无需采取单方面的步骤,而是在较高级别代码的指导下。我可以看到它在模型-视图-控制器框架中的用途。

由于 C++11 具有本地匿名函数,因此可能可以将类似这样的东西组合在一起。尽管这些不是真正的词法闭包(它们只是“向下的函数参数”),但这就是所需要的,因为只需要向下传递处理程序,以便它们可以被较低级别的函数调用,而不必返回。

于 2013-02-23T01:40:40.300 回答