2013-07-17 47 views
3

刚刚在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 

和家庭组。丈夫功能将p的家庭价值设置为f。为什么我的代码不工作?据我所知,我正在做评论中建议的内容。

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

+0

使用setter方法,比如'setHusband(P)''中的类Family',里面,设置当前'Family'对象的'husband'属性以及设置输入'p'对象的'family'属性。 – Bee

+0

我试过或多或少都是一样的东西,看代码。不幸的是,它不工作。上面的代码将设置家庭价值,但不会设置个人价值。任何想法可能是为什么? – csleys

+2

我明白了。也许让'Person'和'Family'类'handle'对象解决了引用问题?只需将'添加到类的定义中即可:http://www.mathworks.com/help/matlab/matlab_oop/comparing-handle-and-value-classes.html – Bee

回答

4

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

为了能够通过引用传递输入参数,您的自定义对象需要是一个handle对象。简单地定义你的类时,从handle继承和应该做的伎俩:

classdef Person < handle 

classdef Family < handle