如果我在MATLAB中制作以下玩具类:
classdef testIt
properties
a
b
c
end
methods
function obj = testIt
obj.a = 1;
obj.b = 2;
end
function obj = set.a(obj,a)
obj.a = a;
end
function obj = set.b(obj,b)
obj.b = b;
end
function obj = addup(obj)
obj.c = obj.a + obj.b;
end
end
end
然后实例化并调用addup
方法:
>> aTest = testIt
Properties:
a: 1
b: 2
c: []
>> aTest.addup
Properties:
a: 1
b: 2
c: 3
>> aTest
Properties:
a: 1
b: 2
c: []
尚未创建属性c
。相反,我需要使用语法:
>> aTest = aTest.addup
>> aTest
Properties:
a: 1
b: 2
c: 3
任何人都可以向我解释为什么这是必要的吗?
答案 0 :(得分:8)
Matlab支持两种类型:处理类和值类。
值类的操作类似于结构和其他Matlab变量,因为它们是按值传递的。因此,如果要修改函数中值类的实例,则需要返回并覆盖调用工作区中的实例。
另一方面,处理类通过引用传递。如果在任何位置更改属性的值,则会在所有工作空间中更新类。例如,您可以在基础工作区中引用对象,在GUI中引用一个对象,如果修改一个,则另一个引用相应地更改其值。
如果您将代码更改为classdef testIt < handle
,则对象的行为将完全符合您的预期。
答案 1 :(得分:0)
添加到类定义中:
classdef testIt < handle