对象方法中的自我引用

4

我刚开始学习Matlab面向对象编程,我想为一个对象编写一个设置方法,该方法将设置该值,然后通过在其他对象上相关字段中设置自身来实现倒数。

classdef Person
properties
  age;
  sex;
  priority; % net priority based on all adjustment values
  adjustment; % personal adjustment value for each interest
  family;
end

methods
  function obj = set.sex(obj, value)
    if value == 'm' || value == 'f'
      obj.sex = value;
    else
      error('Sex must be m or f')
    end
  end

  function obj = set.family(obj,value)
    if class(value) == 'Family'
      obj.family = value;
    else
      error('Family must be of type Family')
    end
  end
end
end



classdef Family
properties
  husband;
  wife;
  children;
  elders;
  adjustment; % interest adjustment values
end

methods
  function this = set.husband(this,person)
    if class(person) == 'Person'
      this.husband = person;
      person.family = this;
    else
      error('Husband must be of type Person')
    end
  end

  function this = set.wife(this,person)
    if class(person) == 'Person'
      this.wife = person;
      person.family = this;
    else
      error('Wife must be of type Person')
    end
  end
end
end

现在我需要做的是:

p = Person
f = Family
f.husband = p
p.family = f

我希望家庭和个人能够自动在彼此之间进行设置。
p = Person
f = Family
f.husband = p

Family set.husband函数将设置p的家庭值为f。为什么我的代码不起作用?据我所知,我正在按照评论中建议的方式进行操作。

编辑: 经过一些尝试后,我确认“this”和“person”是正确类型的对象。最终问题在于Matlab通过值传递而不是通过引用传递。除非有人知道解决方法,否则我会在可以时自己回答。


Family类中使用设置器方法,例如setHusband(p),在其中将当前Family对象的husband属性以及输入对象pfamily属性设置为相应值。 - Bee
我尝试了几乎相同的事情,请参见代码。不幸的是它没有起作用。上述代码将设置家庭值,但不会设置个人值。有任何想法为什么会这样? - csleys
2
我明白了。也许将PersonFamily类设置为handle对象可以解决按引用传递的问题?只需在类的定义中添加< handle即可:http://www.mathworks.com/help/matlab/matlab_oop/comparing-handle-and-value-classes.html - Bee
成功了。非常感谢您,先生。请继续发布答案,以便我给您信用。 - csleys
1个回答

5
普通对象通常被认为是值对象。当它们传递给函数或方法时,只传递值而不是对原始对象的引用。Matlab可能使用只读引用机制来加速,但函数或方法不能更改原始对象的属性。
为了能够通过引用传递输入参数,您的自定义对象需要是句柄对象。简单地在定义类时继承自“handle”,就可以实现这一点:
classdef Person < handle

并且。
classdef Family < handle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接