MATLAB - дескриптор осей удаляется, если в конструкторе класса создается подзаговор - PullRequest
0 голосов
/ 07 апреля 2019

Я выполняю рефакторинг существующего (рабочего) кода MATLAB, в частности извлекаю новый класс из фрагмента структурированного кода, который создает фигуру, и когда я это делаю, я получаю ошибку, вызванную осями фигура удаляется (моя переменная теперь говорит, что она содержит handle to deleted axes).

Более подробно, текущая версия кода выглядит примерно так:

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

... (other stuff)

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

(я упоминаю «другие вещи» и «другие параметры», чтобы пояснить, что строка imshow не находится непосредственно над назначением overlayAxes, на тот случай, если вы считаете, что мне нужно что-то искать, в частности, перед вызовом imshow)

Это отлично работает. Мой рефакторинг состоит в том, чтобы переместить создание Overlay в класс (другими словами, сделать его более «ООП-подобным»). В качестве первого шага я переместил его в класс, подобный этому:

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.

Я читал несколько статей, объясняющих, что оси создаются при создании новых фигур и тому подобное, но я изменяю only , который я делаю, - это преобразование создания фигур из локальной переменной в свойство класса, поэтому я не чувствую, что что-то связано с побочными эффектами повторного вызова функций построения или чего-то подобного, но, может быть, что-то про передачу по ссылке, жизненный цикл объекта или что-то, чего я упускаю полностью, не совсем уверен.

Почему мои оси удаляются? Спасибо!

...