我是面向对象编程的新手,尤其是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
中的实例的节点n1e.node1=[]
然后对象e中的对象node1消失了,但Node变量n1仍然存在。
我想到的(并且想要的)是变量n1和e.node1是相同的,但看起来MATLAB创建了Node n1的两个实例,一个是n1本身,另一个是node1在对象e内,虽然我可以从node1引用n1的值。
我的问题是,如果我想从关联的e中删除n1,那么这样做的有效方法是什么?对面向对象的MATLAB背景的任何其他解释都是受欢迎的。
答案 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引用。因此,n1
和e.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
所以他们每个人都存储对同一个对象的引用。