29

I am trying to create a MATLAB class with a member variable that's being updated as a result of a method invocation, but when I try to change the property within the class it (apperently, from what I understood from MATLAB's memory management) creates a copy of the object and then modifies it, leaving the original object's property untouched.

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  
4

3 回答 3

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的输出参数。

谢谢卡姆兰。

于 2008-10-16T15:53:41.037 回答
7

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

Azim 正确地指出,如果您想要单例行为(从您的代码来看,您似乎是这样),您需要使用“句柄”类。从 Handle 派生的类的实例都指向一个实例,并且只对它进行操作。

您可以阅读有关 Value 和 Handle 类之间差异的更多信息。

于 2008-11-10T16:15:42.203 回答
4

我创建了testprop类并尝试执行 Azim 建议的代码,但它不起作用。当我执行以下命令时:

a=a.Request(1)

产生了以下错误:

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

我认为问题在于我们在声明Request方法时没有确定任何输出。所以我们应该把它改成:

function this = Request(this, val)

现在:

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

ans = 1
于 2009-03-23T12:26:10.703 回答