【问题标题】:MATLAB: multiple object instancesMATLAB:多个对象实例
【发布时间】:2013-02-25 18:15:52
【问题描述】:

我是面向对象编程的新手,尤其是 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 创建了节点 n1 的两个实例,一个是 n1 本身,另一个是 node1在对象 e 中,虽然我可以从 node1 引用 n1 的值。

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

【问题讨论】:

    标签: oop matlab methods


    【解决方案1】:

    您需要将希望通过引用引用的对象子类化为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=[] 时,您会从 e 对象中删除 n1 的引用。 n1 对象仍然存在于工作区中,但 e 没有对其的引用。我相信它会按照您想要的方式工作,只是删除引用不允许自动垃圾收集,除非在 Matlab 工作区中没有对 Matlab 对象的引用。比如:

    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
    

    所以它们各自存储对同一个对象的引用。

    【讨论】:

    • 感谢您的帮助!实际上我确实对节点和边缘进行了子类化(忘了说),我完全同意你的回答。但我仍然不确定以下问题:假设我有一个节点数组:Node(1,N),以及一个 Edge e,其 node1 包含 Node(1,N) 中的某个元素,比如 e.node1=Node (一世)。现在我想删除 Node(i)。当然我可以做Node(i)=[],数组的长度自动更新等等。但是如果我想通过边 e 来做,如何影响原始数组 Node(1,N)?我尝试了 e.node1=[] 或 e.node1=Node。这不会修改数组节点本身。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2014-12-29
    • 1970-01-01
    相关资源
    最近更新 更多