4

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

谁能向我解释为什么这是必要的?

4

2 回答 2

8

Matlab 支持两种类型的类:句柄类值类

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

另一方面,句柄类是通过引用传递的。如果您在任何地方更改属性的值,则会在所有工作区中更新该类。例如,您可以在基础工作区中引用对象,在 GUI 中引用一个对象,如果您修改一个,另一个会相应地更改其值。

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

另外:查看文档

于 2012-12-13T20:12:55.893 回答
0

添加到类定义:

classdef testIt < handle
于 2012-12-13T20:11:56.957 回答