0

我是面向对象编程的新手,尤其是 MATLAB。这是关于对象的多个实例的基本问题。

我在简化的设置中描述了我的问题。

首先我定义了两个类:Node 和 Edge,其中 Node 有一个属性值,而 Edge 包含一个 Node:

classdef Node < handle
  properties
    value
  end

classdef Edge < handle
  properties
    node1
  end

然后我创建了一个节点和一个边

n1=Node;
e=Edge;

我把这个节点关联到边 e

e.node1=n1;

现在问题来了,如果我将值分配给 n1

n1.value=5;

我可以用预期的答案从 e 引用这个值:

e.node1.value
ans = 5

但是如果我想删除节点 n1 引用 e 中的实例

e.node1=[]

那么对象e中的对象node1就没有了,但是Node变量n1还在。

我的想法(并且想要)是变量 n1 和 e.node1 是同一件事,但看起来 MATLAB 创建了节点 n1 的两个实例,一个是 n1 本身,另一个是对象内部的 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 引用。所以,n1e.node1参考同样的事情。但是,当您从对象e.node1=[]中删除引用时。该对象仍然存在于工作空间中,但没有对其的引用。我相信它会按照您想要的方式工作,只是删除引用不允许自动垃圾收集,除非在 Matlab 工作区中没有对 Matlab 对象的引用。就像是:n1en1e

e1 = Edge
e1.node1 = Node

这应该完成垃圾收集,即一旦e1.node1指向[]Node 对象被消除。但是,如果您有:

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 回答