我正在尝试使用一个成员变量来创建一个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
Azim.. 26
使用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类型的输出参数.
谢谢卡姆兰.
使用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类型的输出参数.
谢谢卡姆兰.
你必须记住在Matlab中的语法,你可能比C++或Java更接近C,至少在对象方面.因此,您想要更改值对象的"内容"(实际上只是一个特殊的struct
),您需要从函数返回该对象.
Azim是正确的指出,如果你想要Singleton行为(从你的代码,你似乎),你需要使用"句柄"类.从Handle派生的类的实例都指向单个实例,并且仅对其进行操作.
您可以阅读有关Value和Handle类之间差异的更多信息.