我试图通过调用其成员函数之一来更改类的属性值:
date.today()
在类定义中,我有一个静态方法:
datetime
但是此p1 = tank();
p1.checkOri(p1);
方法不起作用。但是,如果我在主文件中编写此方法,或者说改变classdef tank
properties
value
...
end
methods
...
methods (Static)
function obj = checkOri(obj)
if (CONDITION) %the thing I want it to do
obj.value = EXPRESSION;
...
的值(类checkOri
的实例),则可以完美地工作:
p1
它完美地工作。
我想知道是什么原因造成的。根据我在其他编程语言上的经验,调用方法应该是可行的,是因为Matlab语法或静态方法有一些技巧吗?我如何解决它,以便此方法起作用?
答案 0 :(得分:1)
因此,正如评论中的@Navan所说,handle类可能是一个解决方案。
看来Matlab在Java和C ++中具有类似的参数概念,在函数/方法中修改的参数仅保留该函数/方法中的修改。
对于这个类,我只是在类定义的开头添加了< handle
并起作用:
classdef tank < handle
properties
...
但是我不确定这是否是唯一的解决方案,也许会有更好的方法来做到这一点。因此,我将保留这个问题,欢迎您发表您的意见:D
答案 1 :(得分:1)
在MATLAB中,调用
p1.checkOri();
等同于
checkOri(p1);
在两种情况下,都为对象checkOri
的类调用类方法p1
,并将p1
作为第一个参数传递给函数按值。
由于p1
是按值传递的,因此在调用工作区中的对象看不到函数内部对其进行的任何更改。因此,通常会
p1 = checkOri(p1);
这样,通过值传递并在函数内部进行修改的对象将被传回并分配给保存原始对象的变量。
如果方法编写如下:
function obj = checkOri(obj)
%...
end
然后,MATLAB将优化上面的函数调用,以便实际上不复制对象。请注意,在函数声明和函数调用中,输入和输出变量都是相同的。
正如OP已经发现的那样,以上内容不适用于句柄类,即从handle
继承的类。这些类的作用就像总是通过引用传递,并且在任何工作空间中对其进行的任何更改都将反映在其他工作空间中的所有其他副本中。
还没有为成员变量赋值,因此
p1.value = 0;
修改对象p1
。
有关值类和句柄类之间区别的更多信息,请参见this other question。