我有一个存储图形句柄的类。使用新的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
我做错了课吗?或者这是一个错误吗?
答案 0 :(得分:1)
我在Matlab 2009a上尝试了你的例子(早在新的HG2之前)并且行为与你描述的完全相同。
似乎你在使用Matlab中classes
的工作方式做了一些错误。
基本上,您可以使用任何类型的数值/文本值指定属性的默认值:
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
否则你的类的所有对象(甚至是新创建的)都将指向在实例化第一个对象时仅创建一次的相同实际句柄。
如果要在每次创建类的新对象时生成不同的图形对象( figure ),则必须在类构造函数中生成它。
所以你的班级成为:
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-class构造函数的属性值,MATLAB将其调用 构造函数只有一次,每个实例引用相同的句柄 宾语。如果要将属性值初始化为新值 每次创建一个对象时,一个句柄对象的实例,分配 构造函数中的属性值。