Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实施";“窗口”;系统及「;不删除“self”;规则 我一直在尝试用C++编程一种简单的“窗口”系统,用于游戏中,它可以在游戏区中(在游戏本身的图形内部,即不是OS的GUI窗口)中绘制有按钮等的窗口。窗口对象(这里称之为“类窗口”)有一些事件方法,比如按键,并且能够钩住一个在接收到该事件时调用的处理程序_C++_Oop - Fatal编程技术网

实施";“窗口”;系统及「;不删除“self”;规则 我一直在尝试用C++编程一种简单的“窗口”系统,用于游戏中,它可以在游戏区中(在游戏本身的图形内部,即不是OS的GUI窗口)中绘制有按钮等的窗口。窗口对象(这里称之为“类窗口”)有一些事件方法,比如按键,并且能够钩住一个在接收到该事件时调用的处理程序

实施";“窗口”;系统及「;不删除“self”;规则 我一直在尝试用C++编程一种简单的“窗口”系统,用于游戏中,它可以在游戏区中(在游戏本身的图形内部,即不是OS的GUI窗口)中绘制有按钮等的窗口。窗口对象(这里称之为“类窗口”)有一些事件方法,比如按键,并且能够钩住一个在接收到该事件时调用的处理程序,c++,oop,C++,Oop,窗口是(或将)在“窗口管理器”中收集的,窗口对象将具有“close()”成员,该成员将调用父窗口管理器的窗口删除例程来删除自身。连接到(比如)窗口按钮的事件处理程序可能会调用此例程来关闭窗口(请考虑“确定”框) 问题是,这听起来像是一个“delete*this;”语句,我听说这是一个否定的语句。没错,它不会直接这样做,但效果是一样的:一个对象有一个成员函数导致它自己的破坏(例如,“close()”函数,或者触发导致“close()”的处理程序的事件函数)正在调用的函数。)。如果这样做不好,那么有

窗口是(或将)在“窗口管理器”中收集的,窗口对象将具有“close()”成员,该成员将调用父窗口管理器的窗口删除例程来删除自身。连接到(比如)窗口按钮的事件处理程序可能会调用此例程来关闭窗口(请考虑“确定”框)


问题是,这听起来像是一个“
delete*this;
”语句,我听说这是一个否定的语句。没错,它不会直接这样做,但效果是一样的:一个对象有一个成员函数导致它自己的破坏(例如,“close()”函数,或者触发导致“close()”的处理程序的事件函数)正在调用的函数。)。如果这样做不好,那么有什么更好的设计方法呢?

对象删除本身没有什么问题。您只需告诉窗口管理器从其集合中删除窗口,然后再删除即可。如果让窗口管理器删除窗口对象,那就更好了

如果你真的想避免这种行为,你可以添加一个
booldead
到初始化为
false
的每个窗口。关闭窗口时,设置
this->dead=true。每一帧,让窗口管理器遍历它的窗口,并删除死掉的窗口

请注意,此解决方案仍然无法修复由引用已删除窗口的外部系统引起的错误,但它确实具有集中删除窗口的优点

我设计过很多游戏的窗口系统,根据我的经验,允许windows删除自己是一个非常优雅的解决方案,即使它更容易出错

一个简单的例子:

class Window
{
  public:
    void keyPressCallback(int c)
    {
      if (c == KEY_ESC)
      {
        manager.destroy(this);
        return;
      }
    }
    WindowManager& manager;
};

class WindowManager
{
  public:
    void destroy(Window* target)
    {
      delete target;
      windows.erase(std::find(windows.begin(), windows.end(), target));
    }
    std::vector<Window*> windows;
};

对象删除自身没有什么问题。您只需告诉窗口管理器将窗口从其集合中删除,然后删除即可。如果让窗口管理器删除窗口对象,那就更好了

如果你真的想避免这种行为,你可以添加一个
booldead
到初始化为
false
的每个窗口。关闭窗口时,设置
this->dead=true。每一帧,让窗口管理器遍历它的窗口,并删除死掉的窗口

请注意,此解决方案仍然无法修复由引用已删除窗口的外部系统引起的错误,但它确实具有集中删除窗口的优点

我设计过很多游戏的窗口系统,根据我的经验,允许windows删除自己是一个非常优雅的解决方案,即使它更容易出错

一个简单的例子:

class Window
{
  public:
    void keyPressCallback(int c)
    {
      if (c == KEY_ESC)
      {
        manager.destroy(this);
        return;
      }
    }
    WindowManager& manager;
};

class WindowManager
{
  public:
    void destroy(Window* target)
    {
      delete target;
      windows.erase(std::find(windows.begin(), windows.end(), target));
    }
    std::vector<Window*> windows;
};