属性如何在面向对象的MATLAB中工作



我正试图创建一个带有成员变量的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

相关内容

  • 没有找到相关文章

最新更新