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

eni9jsuy  于 2022-11-30  发布在  Matlab
关注(0)|答案(3)|浏览(155)

我试图创建一个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
zhte4eai

zhte4eai1#

使用实值(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)`

使用句柄类

如果从句柄类继承,也就是

classdef testprop < handle

然后你就可以写了,

>> a.Request(5);
>> a.Request(5);
>> a.numRequests
ans = 
       2

请注意,这会更改对象的行为,请参阅the documentation以了解值类和句柄类之间的区别。

soat7uwm

soat7uwm2#

你必须记住,在Matlab中,你可能更接近C,而不是C++或Java,至少在对象方面是这样。所以,如果你想改变一个值对象的“内容”(实际上只是一个特殊的struct),你需要从函数中返回该对象。
Azim正确地指出,如果你想要Singleton行为(从你的代码看,你似乎是这样),你需要使用一个“handle”类。从Handle派生的类的示例都指向一个示例,并且只对它进行操作。
您可以read more about the differences between Value and Handle classes.

sqougxex

sqougxex3#

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

a=a.Request(1)

生成了以下错误:
使用==〉Request时出错输出参数太多。
我认为问题是我们在声明Request方法时没有确定任何输出。因此我们应该将其更改为:

function this = Request(this, val)

现在:

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

ans = 1

相关问题