matlab - 对象方法中的自引用

标签 matlab oop self-reference

刚开始速成 Matlab OO 编程,我想为一个对象编写一个 set 方法,该方法将设置值,然后通过在另一个对象的相关字段中设置自身来进行交互。

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 的 family 值设置为 f。为什么我的代码不起作用?据我所知,我正在按照评论中的建议进行操作。

编辑: 经过一番折腾后,我确认“this”和“person”是正确类型的对象。最终的问题是 Matlab 按值而不是按引用传递。除非有人知道解决方法,否则我会尽可能自己回答。

最佳答案

普通对象通常被认为是 value 对象。当它们被传递给函数或方法时,传递的只是值,而不是对原始对象的引用。 Matlab 可以使用只读引用机制来加快速度,但函数或方法不能更改原始对象的属性。

为了能够通过引用传递输入参数,您的自定义对象需要是一个handle 对象。只需在定义类时继承 handle 就可以了:

classdef Person < handle

classdef Family < handle

关于matlab - 对象方法中的自引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17702446/

相关文章:

java - 如何像在 Matlab 中一样在 Java 中绘图(相同的语法)

matlab - 多变量遗传算法对基因组执行遗传操作的不同方式的性能影响

c# - 一件元素究竟什么时候被处置?

c - 是否可以在 C 中模拟对象方法?

javascript - 如何在 JavaScript 事件处理程序中引用对象?

matlab - 在使用 plotyy 创建的现有线上方/下方绘制一条线

java - 将Matlab中的快速MCLT算法转换为java

python - 使用unittest时不理解python中的作用域

Python 测试用例在 Google Foobar 挑战中失败

javascript - jQuery插件中的自调用函数