2013-10-03 27 views
3

当我创建自己的类,如下:怪异行为MATLAB有containers.Map作为一个阶级属性

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

我的目标是为testClass每个对象维护自己的地图。但是,事实证明,对于整个班级只有一个地图对象:testClass的所有对象都访问相同的containers.Map。例如,如果我创建两个对象如下

a = testClass; 
b = testClass; 

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

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

它结束了既ab的地图包含两个键 - 值对:

>> 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)同时出现在a.mapb.map

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

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

这是一个错误?我怎样才能为每个类对象保持独立的containers.Map

回答

8

问题不在于testClasshandle,而是在您认为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] 

如果您希望每个实例具有不同的映射,则必须在构造函数中显式构造映射。 (是的,我一直在那里,做到了)。

+0

+1一个很好的答案。 –