2013-07-17 61 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