2012-07-10 31 views
0

我在matlab面向對象編程方面做了一些工作。我有一個屬性類。如果它們是NaN,則屬性被計算,否則該屬性被返回。最大遞歸限制 - 屬性值設置回NaN

所以我有本節:

properties 
some_property = NaN; 
end 

和屬性被計算如下:

function some_property = get_some_property(obj) 

if(isnan(obj.some_property)) 

    % do some expensive computation 
    obj.some_property = ...; 

end 

some_property = obj.some_property; 

甲get_some_property方法可以由另一個get_some_property方法中。問題在於方法調用屬性被重新設置爲NaN。這會導致錯誤:

最大遞歸限制...

任何想法?謝謝。

+0

您的類是引用類型還是值類型?如果引用,那麼你將繼承'handle'。 – Steve 2012-07-10 16:57:55

+0

不確定你指的是什麼。你問是否ny類派生自 cs0815 2012-07-10 17:14:39

+0

是的,如果不是,請參閱下面的sfstewman答案。 – Steve 2012-07-10 19:03:54

回答

2

你的問題是你的班級不是從handle派生的,所以它作爲一個值傳遞。這意味着,當您撥打get_some_property時,Matlab忠實地複製obj,給函數get_some_property一個副本,並將其與名爲get_some_property的代碼副本分開。因此,當您在功能get_some_property中更改some_property時,它會更改該函數中obj值的屬性,但不會調用調用該代碼的obj的屬性。

您的問題有兩種解決方案。最好的解決方案(IMO)是從handle派生你的班級。衍生自handle的類作爲參考傳遞,因此當您更改obj上的屬性時,它將在任何地方更改屬性。

不過,如果你不願意這樣做,那麼你可以從get_some_property返回obj

function [some_property,obj] = get_some_property(obj) 

然後調用get_some_property這樣:

[property,obj] = get_some_property(obj); 

這將更新的價值obj在調用命名空間中。它既笨拙又笨重;除非有充分的理由避免它,否則我會從handle中派生出你的課程。

+0

謝謝。這解決了一個問題。另一個是語義錯誤(stackoverflow),這是我的錯。 – cs0815 2012-07-11 16:43:10