Ошибка "Дескриптор удаленной фигуры" - Matlab hg2 - Сохранение дескриптора фигуры в классе

У меня есть класс, который хранит дескриптор фигуры. С новой графикой Matlab для дескриптора hg2 я получаю сообщение об ошибке "ручка для удаленной фигуры".

classdef mytestclass
    properties
        hFig = figure
    end
end

Создание только одного экземпляра класса работает нормально, я получаю a.hFig в качестве правильного дескриптора фигуры.

a = mytestclass % this will open the figure

Но когда я закрываю фигуру и создаю еще один экземпляр класса, я получаю

b = mytestclass % this won't open any figure
b.hFig % this is now a handle to a deleted figure

Я делаю что-то не так с классами? Или это ошибка?

1 ответ

Решение

Я попробовал ваш пример на Matlab 2009a (задолго до нового HG2), и его поведение точно такое же, как вы описали.

кажется, вы делаете что-то немного не так с тем, как classes работать в Matlab.

В основном вы можете назначить значение по умолчанию для свойства с любым типом числового / текстового значения:

properties
   myProp %// No default value assigned
   myProp = 'some text'; 
   myProp = sin(pi/12); %// Expression returns default value
end

но не назначайте их с ручкой к чему-либо

myProp1 = figure ;       %// all the object of this class will always point to this same figure
myProp2 = plot([0 1]) ;  %// all the object of this class will always point to this same line object

в противном случае все объекты вашего класса (даже недавно созданные) будут указывать на один и тот же фактический дескриптор, который был создан только один раз, когда был создан ваш первый объект.

Если вы хотите создавать новый графический объект (рисунок) каждый раз, когда создаете новый объект вашего класса, вы должны сгенерировать его в конструкторе класса.

Итак, ваш класс стал:

classdef mytestclass
   properties (SetAccess = private) %// you might not want anybody else to modify it
      hFig
   end
   methods
      function obj = mytestclass()
         obj.hFig = handle( figure ) ; %// optional. The 'handle' instruction get the actual handle instead of a numeric value representing it.
      end
   end
end

из справки:

Инициализация свойств для уникальных значений

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

Другие вопросы по тегам