我正试图创建一个带有成员变量的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
使用值(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
正如Kamran所指出的,这需要将函数Request
的定义更改为
function this = Request(this, val)`
使用句柄类
如果您从handle类继承,那就是
classdef testprop < handle
然后你可以写,
>> a.Request(5);
>> a.Request(5);
>> a.numRequests
ans =
2
请注意,这会更改对象的行为,请参阅文档以了解值类和句柄类之间的区别。
你必须记住,在Matlab中,你可能比C++或Java更接近C,至少在对象方面是这样。因此,如果要更改值对象(实际上只是一个特殊的struct
)的"内容",则需要从函数返回该对象。
Azim正确地指出,如果你想要Singleton行为(从你的代码来看,你似乎想要),你需要使用一个"handle"类。从Handle派生的类的实例都指向一个实例,并且仅对其进行操作
您可以阅读更多关于Value和Handle类之间差异的信息。
我制作了testprop类,并试图执行Azim建议的代码,但没有成功。当我执行以下命令时:
a=a.Request(1)
生成以下错误:
使用===>请求时出错输出参数太多。
我认为问题在于,我们在声明Request方法时没有确定任何输出。所以我们应该把它改成:
function this = Request(this, val)
现在:
>> a = testprop;
>> a = a.Request(1);
>> a.numRequests
ans = 1