用户界面 - C++:在事件驱动系统中间接调用“删除此内容”(例如在GUI应用程序中)
user interface - C++: indirect invocation of `delete this` in event driven system (e.g. in GUI application)
我使用不同的C++GUI框架(例如Qt,wxWidgets,也有一些专有的)工作了一段时间,但无法自己决定下面描述的主题。
正如此处的几个问题/答案中所讨论的,直接使用 delete this
在C++中是有效的(只要您不再取消引用this
),但在大多数情况下这不是一个好主意。
但在某些情况下,对象会间接调用其析构函数。这种情况尤其经常出现在事件驱动系统中(首先想到的是GUI应用程序)。
class Kernel {
public:
void Start() {
_window = new Window();
}
void OnCloseButton() {
if (_window) {
_window->Close();
delete _window;
_window = NULL;
}
private:
MyWindow * _window;
};
class MyWindow
{
public:
MyWindow(Kernel & kernel) : _kernel(&kernel) {
Connect(my_button_close_event, this, OnCloseButtonClicked);
}
OnCloseButtonClicked() {
// This call actually calls destructor of this object.
_kernel->OnCloseButton();
// If we access any fields of Window here, we're going to have problems
}
private:
Kernel * _kernel;
};
注意:我没有尝试编译代码 - 它可能有错别字或不良做法。但它应该说明这个想法。
所以,问题是:是否可以像上面的例子那样做一些事情:事件的处理程序调用其他一些函数(其所有者的方法),间接删除this
?
或者我应该更好地让Kernel
类事件感知并将事件从按钮直接连接到Kernel
中的方法,然后我们就不会有这种间接调用delete this
的情况。
提前谢谢。
这是
可能的,因为 Window 实例是由 Start() 方法创建的,但这在面向对象编程中是一种不好的做法。
相关文章:
- 调试捕获此内容的 lambda
- 稍后在构造函数中重新启动异常指令删除此指令
- 如何从 txt 文件中删除数据/内容
- 为什么删除此类型别名中的 const 限定符?
- 从构造函数中删除此指针
- 为什么将鼠标悬停在静态 Win32 控件上会增加内存并删除我的 GUI?
- 是否可以删除此条件语句
- 如何删除此与继承相关的代码气味
- 无法通过 .erase 从矢量 c++ 中删除任何内容
- 运行时检查失败#2 - 变量周围的堆栈'myArray'已损坏.- 似乎无法弄清楚如何删除此错误
- 如何添加到此代码中,以便它打印"b"而不删除任何内容?
- 在可移动类型的构造函数 lambda 中捕获此内容的安全使用
- 诅咒 - "move"及其删除屏幕内容
- 我怎么知道我是否需要在C 中删除某些内容
- 如何添加到链接列表中以获得最佳拟合管理或删除某些内容
- 将删除此调用析构函数
- 从类中删除指向此内容的指针
- 如何删除此内容以防止内存泄漏
- 为什么删除的默认构造函数没有捕获此内容?
- 用户界面 - C++:在事件驱动系统中间接调用“删除此内容”(例如在GUI应用程序中)