我正在尝试使用一个成员变量创建一个MATLAB类,该变量由于方法调用而被更新,但是当我尝试更改类中的属性时(显然,我从MATLAB的内存管理中理解)创建对象的副本,然后修改它,保持原始对象的属性不变。
classdef testprop
properties
numRequests=0;
end
methods
function Request(this, val)
disp(val);
this.numRequests=this.numRequests+1;
end
end
end
>> a=testprop;
>> a.Request(9);
>> a.Request(5);
>> a.numRequests
ans = 0
答案 0 :(得分:25)
使用vanilla类时,您需要告诉Matlab存储对象的修改副本以保存属性值中的更改。所以,
>> a=testprop
>> a.Request(5); % will NOT change the value of a.numRequests.
5
>> a.Request(5)
5
>> a.numRequests
ans =
0
>> a=a.Request; % However, this will work but as you it makes a copy of variable, a.
5
>> a=a.Request;
5
>> a.numRequests
ans =
2
如果从句柄类继承,那就是
classdef testprop < handle
然后你可以写,
>> a.Request(5);
>> a.Request(5);
>> a.numRequests
ans =
2
正如Kamran注意到以上工作原理,问题示例代码中Request
方法的定义需要更改为包含 testprop 类型的输出参数。
谢谢Kamran。
答案 1 :(得分:8)
你必须记住在Matlab中的语法,你可能比C ++或Java更接近C,至少在对象方面。因此,您想要更改值对象的“内容”(实际上只是一个特殊的struct
),您需要从函数返回该对象。
Azim指出,如果你想要Singleton行为(你的代码看起来似乎如此),你需要使用“句柄”类。从Handle派生的类的实例都指向单个实例,并且仅对其进行操作。
你可以read more about the differences between Value and Handle classes.
答案 2 :(得分:4)
我创建了类 testprop 并试图执行Azim建议的代码,但它没有用。当我执行以下命令时:
a=a.Request(1)
生成了以下错误:
???使用==&gt;时出错请求 输出参数太多。
我认为问题是我们在声明请求方法时没有确定任何输出。所以我们应该把它改成:
function this = Request(this, val)
现在:
>> a = testprop;
>> a = a.Request(1);
>> a.numRequests
ans = 1