2011-11-10 3 views
8

私はMatlabクラスとそのプロパティについてもう少し理解しようとしています。ここで私が作成したテストクラスである:プロパティがクラスメソッドから新しい値を引き継ぐのはなぜですか?

classdef Test  
    properties 
     % Properties of the network type 
     some_var 
    end 

    methods 
     function N = Test() 
     end 

     function change_var(N, val) 
      N.some_var=val; 
     end 
    end 
end 

さて、私はこのクラスのインスタンスを作成し、「change_varを()」を呼び出し...

>> a=Test; 
>> a.change_var(2); 
>> a.some_var 

ans = 

    [] 

はなぜプロパティ「some_var」を持っています代入の値 "val"には取り込まれませんか?

+0

を参照してください:次に、あなたに変更してaを更新する必要があります(http://stackoverflow.com/questions/6436539/matlab-classes-handle-or-を値)を使用して、ハンドル対値クラスの説明を行います。 –

答えて

11

Testクラスはvalue-class as opposed to a handle classと定義されています。事実、a.change_varに電話すると、aが値渡しされます。 some_varプロパティへの変更を保存するには次の操作を行います。

 
>> a = Test; 
>> a = a.change_var(2); 

代替は、あなたの質問の例は、あなたが期待通りに動作しますTestハンドルクラス、その場合にすることです。これを行うには、これまであなたのクラス定義の最初の行を変更することにより、handleクラスから継承:

 
classdef Test < handle 
+0

ビンゴ!私は答えとしてこれを選択するのに4分待たなければなりませんでした。 – gnychis

+4

クラスが** handle **になると、このクラスが割り当てられた変数メモリ内の同じオブジェクトへの参照。これらの変数のいずれかのプロパティを変更すると、他のプロパティの値がc#のオブジェクト参照と同様に変更されます。 – Celdor

3

方法は、プロパティを変更する方法を提供していますが、オブジェクトを返す必要があります。次のようにメソッドを変更する必要があります。

function N = change_var(N, val) 
    N.some_var=val; 
end 

この関数は、変更されたオブジェクトを返します。 [MATLABクラス:ハンドルまたは値]

a = a.change_var(2); 
+2

明確にする:ここに示す例は、値オブジェクトクラス(つまり、ハンドルオブジェクトではない)に対するものであり、元のオブジェクト自体のプロパティを変更しません。この関数は、N引数の元のオブジェクトの_copy_を受け取り、そのオブジェクトのsome_varプロパティを変更し、オブジェクトの変更されたコピーを返します。 – gwideman

関連する問題