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

属性在面向对象的MATLAB中是如何工作的?,matlab,oop,properties,matlab-class,Matlab,Oop,Properties,Matlab Class,我试图创建一个MATLAB类,其中包含一个成员变量,该变量将作为方法调用的结果进行更新,但当我试图更改类中的属性时,它(显然,根据我从MATLAB的内存管理中了解的情况)会创建一个对象的副本,然后对其进行修改,保留原始对象的属性不变 classdef testprop properties numRequests=0; end methods function Request(this, val)

我试图创建一个MATLAB类,其中包含一个成员变量,该变量将作为方法调用的结果进行更新,但当我试图更改类中的属性时,它(显然,根据我从MATLAB的内存管理中了解的情况)会创建一个对象的副本,然后对其进行修改,保留原始对象的属性不变

classdef testprop  
    properties  
        numRequests=0;  
    end  
    methods  
        function Request(this, val)  
            disp(val);  
            this.numRequests=this.numRequests+1;  
        end  
    end  
end  

使用普通类 当使用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
使用Handle类 如果从handle类继承,则

classdef testprop < handle
更新:使用香草类 如上所述,需要修改问题示例代码中的
Request
方法的定义,以包含testprop类型的输出参数


<> P.> KAMRAN。

< P> Matlab中必须记住句法,你可能更接近C,而不是C++或java,至少在对象方面更接近C。因此,如果您想要更改值对象的“内容”(实际上只是一个特殊的
struct
),您需要从函数返回对象

Azim正确地指出,如果您想要行为(从代码来看,您似乎想要),则需要使用“handle”类。从Handle all派生的类的实例指向单个实例,并且仅对其进行操作


您可以

我创建了类testprop,并尝试执行Azim建议的代码,但没有成功。当我执行以下命令时:

a=a.Request(1)
生成了以下错误:

???使用==>请求时出错 输出参数太多

我认为问题在于,我们在声明请求方法时没有确定任何输出。因此,我们应该将其改为:

function this = Request(this, val)
现在:

>> a = testprop;
>> a = a.Request(1);        
>> a.numRequests

ans = 1

是-这说明了这个问题,尽管第8行是这样的。numRequests=this.numRequests+1;编辑我的答案以考虑你的编辑。哦,啊。。。我仍然在使用R2006b,我猜他们最终在MATLAB中实现了类“real”(曾经是一个让人头疼的问题),如果“testprop”是作为标准/普通类编写的,那么您需要从“Request”返回对象。如果“testprop”是从handle类派生的,则不需要返回任何内容。您只需使用调用“a.Request(1);”。是的,您是对的,但正如问题中所述,Azim假设testprop类的定义不是从handle类派生的。所以他应该修改方法“Request”。@Kamran,刚刚检查过,你是对的。在测试普通案例时,我必须为请求包含一个输出参数。感谢您的澄清。从
句柄派生出的
本身并不能形成单例模式。链接不再指向我认为的目的。
function this = Request(this, val)
>> a = testprop;
>> a = a.Request(1);        
>> a.numRequests

ans = 1