Oop MATLAB:多对象实例
我不熟悉面向对象编程,尤其是MATLAB。下面是一个关于对象的多个实例的基本问题 我在一个简化的环境中描述我的问题 首先,我定义了两个类:节点和边,其中节点具有属性值,边包含节点:Oop MATLAB:多对象实例,oop,matlab,methods,Oop,Matlab,Methods,我不熟悉面向对象编程,尤其是MATLAB。下面是一个关于对象的多个实例的基本问题 我在一个简化的环境中描述我的问题 首先,我定义了两个类:节点和边,其中节点具有属性值,边包含节点: classdef Node < handle properties value end 我将这个节点与边e相关联 e.node1=n1; 现在问题来了,如果我给n1赋值 n1.value=5; 我可以从e中引用该值,并给出预期答案: e.node1.value ans = 5 但是如果我
classdef Node < handle
properties
value
end
我将这个节点与边e相关联
e.node1=n1;
现在问题来了,如果我给n1赋值
n1.value=5;
我可以从e中引用该值,并给出预期答案:
e.node1.value
ans = 5
但是如果我想删除引用e中实例的节点n1
e.node1=[]
然后,对象e中的对象node1消失了,但是节点变量n1仍然存在
我想(并且想要)的是变量n1和e.node1是一样的,但是看起来MATLAB创建了两个节点n1的实例,一个是n1本身,另一个是对象e内部的node1,尽管我可以从node1引用n1的值
我的问题是,如果我想从关联的e中删除n1,那么什么是有效的方法?对于面向对象的MATLAB背景的任何其他解释,我们都绝对欢迎。您需要将希望引用的对象子类化为
句柄。
这将允许工作区中的引用与引用类引用的相同对象相匹配。下面是一个例子:
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
这应该完成垃圾收集,即一旦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
因此,它们各自存储对同一对象的引用。谢谢您的帮助!事实上,我确实对节点和边进行了子类化(忘了这么说),我完全同意你的答案。但我仍然不能确定以下问题:假设我有一个Node:Node(1,N)数组和一条边e,其node1包含Node(1,N)中的某个元素,比如e.node1=Node(I)。现在我想删除节点(I)。当然我可以做Node(I)=[],数组的长度会自动更新等等。但是,如果我想通过边缘e来实现,我如何影响原始数组节点(1,N)?我尝试了e.node1=[]或e.node1=Node。这不会修改阵列节点本身。
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
e1 = Edge
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