【问题标题】:Self reference within an object method对象方法中的自引用
【发布时间】:2013-07-17 14:25:09
【问题描述】:

刚开始在 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 的家庭值设置为 f。为什么我的代码不起作用?据我所知,我正在执行 cmets 中的建议。

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

【问题讨论】:

  • Family类中使用setHusband(p)之类的setter方法,在里面设置当前Family对象的husband属性,同时设置输入@的family属性987654330@对象。
  • 我尝试了或多或少相同的事情,请参阅代码。不幸的是,它不起作用。以上代码将设置family值,但不设置person值。知道为什么会这样吗?
  • 我明白了。也许制作PersonFamilyhandle 对象可以解决引用传递问题?只需在类的定义中添加< handlemathworks.com/help/matlab/matlab_oop/…
  • 成功了。非常感谢好先生。继续并发布答案,以便我给你信用。

标签: matlab oop self-reference


【解决方案1】:

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

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

classdef Person < handle

classdef Family < handle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多