29

メソッド呼び出しの結果として更新されるメンバー変数を使用して 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  
4

3 に答える 3

26

バニラクラスの使用

バニラ クラスを使用する場合、オブジェクトの変更されたコピーを保存してプロパティ値の変更を保存するように 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

更新: バニラ クラスの使用

上記が機能するためにカムランが指摘しているように、質問のコード例のメソッドの定義をRequest変更して、タイプtestpropの出力引数を含める必要があります。

ありがとうカムラン。

于 2008-10-16T15:53:41.037 に答える
7

Matlab では構文的に、少なくともオブジェクトに関しては、C++ や Java よりもおそらく C に近いことを覚えておく必要があります。したがって、値オブジェクト (実際には特別な ) の「内容」を変更したい場合structは、関数からオブジェクトを返す必要があります。

Azim は、 Singletonの動作が必要な場合 (コードからはそう思われる)、「ハンドル」クラスを使用する必要があることを指摘して正解でした。Handle all から派生したクラスのインスタンスは、単一のインスタンスを指し、そのインスタンスでのみ動作します。

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 に答える