Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop MATLAB:多对象实例_Oop_Matlab_Methods - Fatal编程技术网

Oop 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 但是如果我

我不熟悉面向对象编程,尤其是MATLAB。下面是一个关于对象的多个实例的基本问题

我在一个简化的环境中描述我的问题

首先,我定义了两个类:节点和边,其中节点具有属性值,边包含节点:

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