我创建自己的类如下:

classdef testClass < handle
    properties
        value;
        map = containers.Map('KeyType','double','ValueType','any');
    end
end

我的目标是让testClass的每个对象都保持自己的映射然而,事实证明,对于整个类,只有一个map对象:testClass的所有对象都可以访问同一个containers.Map例如,如果我创建两个对象,如下所示
a = testClass;
b = testClass;

a.value = 'a';
b.value = 'b';

a.map(1) = 123;
b.map(2) = 321;

它的map包含两个键值对:
>> a
a =
  testClass handle

    Properties:
      value: 'a'
        map: [2x1 containers.Map]

>> b
b =
  testClass handle

    Properties:
      value: 'b'
        map: [2x1 containers.Map]
    Methods, Events, Superclasses

(键,值)对(1123)和(2321)都出现在ab
>> a.map.keys
ans =
    [1]    [2]
>> a.map.values
ans =
    [123]    [321]

>> b.map.keys
ans =
    [1]    [2]
>> b.map.values
ans =
    [123]    [321]

这是虫子吗如何保持每个类对象的独立性?

最佳答案

问题不在于testClass是一个handle,而在于properties块中指定的初始值在您认为是的时候没有计算出来加载类时,MATLAB只计算一次类属性的默认值,然后将该值赋给类的每个新实例。
通过查看testClass的元类可以看到这一点例如:

c = testClass;
c.map(1) = 42;
hc = ?testClass;
hc.PropertyList(2).DefaultValue.keys % returns [1]
hc.PropertyList(2).DefaultValue.values % returns [42]

如果希望每个实例具有不同的映射,则必须在构造函数中显式构造映射(是的,我去过那里,做过那件事)。

10-07 19:52
查看更多