MATLAB:多个对象实例

时间:2013-02-25 18:15:52

标签: oop matlab methods

我是面向对象编程的新手,尤其是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

但是如果我想删除引用e

中的实例的节点n1
e.node1=[]

然后对象e中的对象node1消失了,但Node变量n1仍然存在。

我想到的(并且想要的)是变量n1和e.node1是相同的,但看起来MATLAB创建了Node n1的两个实例,一个是n1本身,另一个是node1在对象e内,虽然我可以从node1引用n1的值。

我的问题是,如果我想从关联的e中删除n1,那么这样做的有效方法是什么?对面向对象的MATLAB背景的任何其他解释都是受欢迎的。

1 个答案:

答案 0 :(得分: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=[]时,您会从n1对象中删除e的引用。 n1对象仍然存在于工作空间中,但e没有对它的引用。我相信它的工作方式与你想要的一样,只是删除引用,不允许自动垃圾收集,除非在Matlab工作区中没有引用Matlab对象。类似的东西:

e1 = Edge
e1.node1 = 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

所以他们每个人都存储对同一个对象的引用。