用户界面 - C++:在事件驱动系统中间接调用“删除此内容”(例如在GUI应用程序中)

user interface - C++: indirect invocation of `delete this` in event driven system (e.g. in GUI application)

本文关键字:删除此内容 GUI 应用程序 删除 事件驱动 C++ 系统 中间 用户界面 调用      更新时间:2023-10-16

我使用不同的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() 方法创建的,但这在面向对象编程中是一种不好的做法。