首页 > 解决方案 > MATLAB - 如果在类构造函数中创建子图,则轴句柄将被删除

问题描述

我正在重构一个现有的(工作的)MATLAB 代码,特别是我从一段创建图形的结构化代码中提取一个新类,当我这样做时,我得到一个由图形的轴被删除引起的错误(我的变量现在说它包含一个handle to deleted axes)。

更详细地说,当前版本的代码执行如下操作:

Overlay = figure
overlayAxes = subplot(1, 2, 1, 'Parent', Overlay)

... (other stuff)

imshow(... other parameters ..., overlayAxes)

(我提到“其他东西”和“其他参数”以澄清该imshow行不直接在overlayAxes分配之上,以防你认为我应该在调用之前特别寻找任何东西imshow

这工作正常。我的重构在于将创建移动Overlay到一个类(换句话说,使它更像“OOP”)。作为第一步,我将它移到这样的类中:

classdef MyGUI < handle

  properties(SetAccess = public)
    Overlay
    overlayAxes
  end

  methods
    function obj = MyGUI()
      obj.Overlay = figure;
      obj.overlayAxes = subplot(1, 2, 1, 'Parent', obj.Overlay);
    end
  end
end

然后我引用了这个Overlay最初创建的新类:

GUI = MyGUI;
Overlay = GUI.Overlay;
overlayAxes = GUI.overlayAxes;

(我做了这两个变量赋值,所以我现在不必更改其余代码 - 因为它Overlay不引用GUI.Overlay- 特别是对 的调用imshow

所以,当我这样做时,调用imshow失败说:

Error using imshow>validateParent (line 375)
HAX must be a valid axes handle.

事实证明,当我调试和检查时overlayAxes,它说它包含一个handle to deleted axes.

我读过一些文章,解释当创建新图形时轴会被删除等,但我所做的唯一更改是将图形创建从局部变量转换为类属性,所以我不觉得是什么与再次调用绘图函数或类似的副作用有关,但可能与通过引用传递、对象生命周期或我完全丢失的东西有关,不太确定。

为什么我的斧头会被删除?谢谢!

标签: matlabooprefactoringmatlab-figure

解决方案


推荐阅读