Matlab 如何更改map.continer子类中的值
我有一个超类Matlab 如何更改map.continer子类中的值,matlab,oop,Matlab,Oop,我有一个超类 classdef SysSignal<handle %SIGNALP Summary of this class goes here % Detailed explanation goes here properties (SetAccess = public, GetAccess = public ) SetOfSignal = containers.Map('KeyType','char', 'ValueType', 'any') end me
classdef SysSignal<handle
%SIGNALP Summary of this class goes here
% Detailed explanation goes here
properties (SetAccess = public, GetAccess = public )
SetOfSignal = containers.Map('KeyType','char', 'ValueType', 'any')
end
methods
%constructor
function sys=SysSignal()
end
function sys=adds(sys,varargin)
%convert form cell to signalup
for n=1:length(varargin)
signal=varargin{1,n};
if isempty(signal.name)
continue
else
%add to the map
sys.SetOfSignal(signal.name)= signal;
end
end
end
但我有一个错误:
???使用==>subsasgn时出错
containers.Map只支持一级索引
如何更改超类中的值 答案是将
sys.SetOfSignal('dd').sumrole='hello'
分成两条语句:
dd = sys.SetOfSignal('dd');
dd.sumrole='hello'
这是因为sys.SetOfSignal('dd').sumrole并不像你直觉上想象的那样。实际上,containers.Map
类重载了下标引用和下标赋值运算符。本质上,它们同时“截取”()
、{}
和
操作符(即.sumrole
被“发送”到map.Containers对象,而不是您的对象!)。在我看来,这是一个非常奇怪的设计决定,但我们必须接受它
有关更多信息,请查看以下链接:
,gregswiss的答案是正确的,只是访问容器映射会创建一个副本,因此您可以通过用新的修改值替换旧值来完成
dd = sys.SetOfSignal('dd');
dd.sumrole='hello'
sys.SetOfSignal('dd') = dd;
这行吗
dd=sys.SetOfSignal('dd');dd.sumrole='hello'
?谢谢,但这怎么可能呢?创建新变量影响现有变量这通常是正确的。但是OP的容器包含一个类的对象,该类派生自handle
,因此所有副本都引用相同的数据;更改一个副本也会更改所有其他副本。
dd = sys.SetOfSignal('dd');
dd.sumrole='hello'
dd = sys.SetOfSignal('dd');
dd.sumrole='hello'
sys.SetOfSignal('dd') = dd;