调用MATLAB类实例的副作用不会持久存在

时间:2012-12-13 20:03:09

标签: matlab oop matlab-class

如果我在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

任何人都可以向我解释为什么这是必要的吗?

2 个答案:

答案 0 :(得分:8)

Matlab支持两种类型:处理类值类

值类的操作类似于结构和其他Matlab变量,因为它们是按值传递的。因此,如果要修改函数中值类的实例,则需要返回并覆盖调用工作区中的实例。

另一方面,

处理类通过引用传递。如果在任何位置更改属性的值,则会在所有工作空间中更新类。例如,您可以在基础工作区中引用对象,在GUI中引用一个对象,如果修改一个,则另一个引用相应地更改其值。

如果您将代码更改为classdef testIt < handle,则对象的行为将完全符合您的预期。

另外:Have a look at the documentation

答案 1 :(得分:0)

添加到类定义中:

classdef testIt < handle