1

我有一个存储图形句柄的类。使用新的 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

我在课堂上做错了吗?或者这是一个错误?

4

1 回答 1

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 仅在加载类定义时将属性分配给指定的默认值一次。因此,如果您 使用句柄类构造函数初始化属性值,MATLAB 只会调用此构造函数一次,并且每个实例都引用同一个句柄对象。如果您希望每次创建对象时将属性值初始化为句柄对象的新实例,请在构造函数中分配属性值。

于 2014-11-15T14:37:13.750 回答