2012-07-10 80 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