C++有没有办法抛出一个'event',它会像异常一样'bubble'堆栈?
In C++ is there any way to throw an 'event' which would 'bubble' up the stack like an exception?
我正在制作一个MVC应用程序,我想要的是某种方式来触发某种信号或事件,将其"冒泡"到更高级别的视图类,并进行处理。这种"冒泡"和处理的行为与异常的抛出和捕获完全相同,只是当事件像异常一样被"抛出"时,执行显然不会停止。
C++中存在这样的东西吗?
我的基本原理是,较低级别的模型类不需要了解任何关于视图的信息就可以工作。我不想在任何地方都向视图传递函数/对象指针。
编辑:我可能应该补充一点,我的应用程序使用标准C++,所以目前还没有QT,尽管我可能会尝试将其链接到QT GUI。将QT特定代码与标准C++一起包含在模型类中是否明智。
您要查找的是可重启的异常。这些并没有在C++中实现。在C++中,对异常处理程序的搜索在搜索时执行展开,因此当找到处理程序时,该处理程序和抛出站点之间的所有信息都已被丢弃,因此无法返回到抛出站点。
Common Lisp有可重启的异常(它们被称为条件,而不是被"抛出",而是被"发出信号")。当一个条件被发出信号时,就会通过处理程序的动态上下文进行搜索。处理程序是使用类型层次结构来识别的,这与C++和其他语言非常相似。但此时并没有解除。条件处理程序(由它们自己或与重新启动处理程序协作)决定执行将在哪里继续。这是非常有用的,因为它允许较低级别的代码从情况中恢复,而不需要采取单方面的步骤,而是在较高级别代码的指导下。我可以看到它在模型-视图-控制器框架中是多么有用。
由于C++11具有本地匿名函数,也许类似这样的函数可以组合在一起。虽然这些不是真正的词法闭包(它们只是"向下的funarg"),但这就是所需要的,因为处理程序只需要向下传递,就可以被较低级别的函数调用,而不必返回。
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- C++有没有办法抛出一个'event',它会像异常一样'bubble'堆栈?