0

オブジェクト指向プログラミング、特に MATLAB は初めてです。これは、オブジェクトの複数のインスタンスに関する基本的な質問です。

簡単な設定で私の問題を説明します。

まず、Node と Edge の 2 つのクラスを定義しました。ここで、Node にはプロパティ値があり、Edge には Node が含まれています。

classdef Node < handle
  properties
    value
  end

classdef Edge < handle
  properties
    node1
  end

次に、1 つのノードと 1 つのエッジを作成しました

n1=Node;
e=Edge;

そして、このノードをエッジ e に関連付けます

e.node1=n1;

値を n1 に割り当てると、問題が発生します

n1.value=5;

予想される答えで e からこの値を参照できます。

e.node1.value
ans = 5

しかし、eのインスタンスを参照しているノードn1を削除したい場合

e.node1=[]

次に、オブジェクト e のオブジェクト node1 はなくなりますが、Node 変数 n1 はまだそこにあります。

私が念頭に置いていた (そして望んでいた) ことは、変数 n1 と e.node1 は同じものですが、MATLAB がノード n1 の 2 つのインスタンスを作成したように見えます。1 つは n1 自体で、もう 1 つはオブジェクト内の node1 です。 e ですが、node1 から n1 の値を参照できます。

私の質問は、関連する e から n1 を削除したい場合、効率的な方法は何でしょうか? オブジェクト指向 MATLAB の背景に関するその他の説明は大歓迎です。

4

1 に答える 1

0

参照によって参照するオブジェクトをサブクラス化する必要があります。handle. これにより、ワークスペース内の参照が参照クラスによって参照される同じオブジェクトと一致するようになります。次に例を示します。

classdef MyEdge < handle
  properties
    node1
  end
end


classdef MyNode < handle
  properties
    value
  end
end
n = MyNode
e = MyEdge;
n.value = 7
e.node1 = n
disp(e.node1.value)
  7
n.value = 42
disp(e.node1.value)
  42

他にも無関係な情報があります。完全に軌道から外れている場合はお知らせください。:-)

Matlab でオブジェクトを作成し、そのオブジェクトへの参照を別の場所に保存すると、実際の OO 参照のように動作します。だから、同じことn1を参照してください。e.node1ただし、オブジェクトからのe.node1=[]参照を削除すると。オブジェクトはまだワークスペースに存在しますが、それへの参照はありません。MatlabワークスペースにMatlabオブジェクトへの参照がない限り、参照を削除しても自動ガベージコレクションが許可されないというだけで、あなたが望むように機能すると思います。何かのようなもの:n1en1e

e1 = Edge
e1.node1 = Node

これでガベージ コレクションが完了するはずです。つまり、Node オブジェクトe1.node1へのポイントが削除されます。[]ただし、次の場合:

e1 = Edge
e2 = Edge
e1.node1 = Node
e2.node1 = e1.node1
e1.node1.value = 5
if( e1.node1.value == 5 )
  disp('It''s equal!!')
end

したがって、それぞれが同じオブジェクトへの参照を格納します。

于 2013-02-25T18:44:12.090 に答える