我的目标是:
使用MATLAB,在一个类方法中设置属性值,并且实例之间的属性值不同。
我的问题是:
在类方法中使用SET时,我将更改此类的所有实例的属性值,这不是我想要的。我只想更改此实例的属性值。
关于动态属性:我认为它用于创建实例的唯一属性,而不是设置常规类属性的唯一值,是吗?
代码示例:
classdef Storage
properties
tree = containers.Map('KeyType','int32', 'ValueType','any')
end
methods
function obj = set_tree(obj,period, value)
obj.tree(period) = value;
end
end
end
使用此方法设置值时:
st1 = Storage();
st2 = Storage();
st1 = st1.set_tree(10,1);
st2 = st2.set_tree(10,2);
现在,设置为st2.tree(10)
的值将覆盖设置为st1.tree(10)
的值,我试图避免这种情况。
答案 0 :(得分:1)
您遇到的问题是将handle class对象设置为类属性的default value。 The relevant documentation说:
MATLAB®仅在加载类时评估属性默认值。每次创建该类的对象时,MATLAB都不会重新评估赋值。如果在类定义中将对象指定为默认属性值,则MATLAB在加载类时仅调用该对象的构造函数。
因此,对于上面的Storage
类,所有实例将使用存储在tree
属性中的相同默认containers.Map
对象。由于containers.Map
类是handle
类的子类,因此它具有引用行为,这意味着对象的副本都将指向相同的底层键/值映射。如果您希望每个实例都有独立的对象,则可以在构造函数中初始化tree
属性:
classdef Storage
properties
tree
end
methods
function obj = Storage()
obj.tree = containers.Map('KeyType','int32', 'ValueType','any');
end
function obj = set_tree(obj, value, period)
obj.tree(period) = value;
end
end
end