2016-05-06 5 views
0

私はいくつかのプロパティとメソッドを持つ単純なMATLABクラスを作成しています。クラスのコンストラクタは、プロパティをデフォルト値で初期化します。クラスのメソッドは、クラスのプロパティを更新するためにクラスが構築された後に追加の入力を取得します。MATLABクラスオブジェクトが更新されない

classdef classTest 
    properties 
     p1 
     p2 
     p3 
     p4 
    end 

    methods 

     function obj = classTest() 
      obj.p1 = 0; 
      obj.p2 = 0; 
      obj.p3 = []; 
      obj.p4 = ''; 
     end 

     function obj = updateSomeProperties(obj, p1) 
      obj.p1 = p1; 
     end 
    end 

end 

ただし、クラスのメソッドを呼び出すと、プロパティは更新されません。

>> b = classTest 

b = 

    classTest with properties: 

    p1: 0 
    p2: 0 
    p3: [] 
    p4: '' 

>> b.updateSomeProperties(10) 

ans = 

    classTest with properties: 

    p1: 10 
    p2: 0 
    p3: [] 
    p4: '' 

>> b % still used the default values. 

b = 

    classTest with properties: 

    p1: 0 
    p2: 0 
    p3: [] 
    p4: '' 

私はupdateSomePropertiesは、クラスオブジェクトを更新しますが、クラスのメソッドを呼び出した後、bが更新されない理由を知りたいと思いました。

答えて

2

問題は、あなたのクラスがのクラスであり、コピーとして(それ自身のメソッドにさえ)渡されるということです。これは、all fundamental MATLAB datatypes areのように、MATLABクラスのデフォルトの動作です。これは、updateSomeProperties()への電話の出力を見ることで確認できます。返された結果(ansとして表示)には、元のオブジェクトであるbには存在しない変更が含まれていることがわかります。値クラスを使用する場合は、メソッドから新しいオブジェクトを戻し、メソッドを呼び出すときに変数を再割り当てする必要があります。何をしたい

b = classTest(); 
b = b.updateSomeProperties(10); 

は常に参照によって渡されハンドルクラスです。これにより、元のオブジェクトのコピーを変更するのではなく、同じオブジェクトでメソッドを操作することができます。

これを行うには、組み込みのhandleクラスから継承する必要があります。

classdef classTest < handle 

ハンドルクラスと値クラスの詳細は、in the documentationです。

サイドノートでは、コンストラクタ内のすべてのデフォルトプロパティ値を手動で設定するのではなく、propertiesブロック内でこれらのデフォルトを簡単に指定することができます。

properties 
    p1 = 0; 
    p2 = 0; 
    p3 = []; 
    p4 = ''; 
end 
1

クラスはハンドルスーパークラスから継承する必要があります。試してみてください:

classdef classTest < handle 
properties 
    p1 
    p2 
    p3 
    p4 
end 

methods 

    function obj = classTest() 
     obj.p1 = 0; 
     obj.p2 = 0; 
     obj.p3 = []; 
     obj.p4 = ''; 
    end 

    function obj = updateSomeProperties(obj, p1) 
     obj.p1 = p1; 
    end 
end 
end 

これは、

>> b = classTest 

b = 

classTest with properties: 

p1: 0 
p2: 0 
p3: [] 
p4: '' 

>> b.updateSomeProperties(10) 

ans = 

    classTest with properties: 

p1: 10 
p2: 0 
p3: [] 
p4: '' 

>> b 

b = 

classTest with properties: 

p1: 10 
p2: 0 
p3: [] 
p4: '' 
を与える
関連する問題