0

我正在尝试 matlab 面向对象的编程。我有一个带有属性的类。如果属性为 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。这会导致错误:

最大递归限制...

有任何想法吗?谢谢。

4

1 回答 1

2

您的问题是您的类不是从 派生的handle,因此它作为值传递。这意味着当您调用时get_some_property,Matlab 会忠实地复制obj,为函数提供一个副本,并将其get_some_property与调用的代码的副本分开get_some_property。因此,当您更改some_property函数get_some_property时,它会更改函数中值的obj属性,但不会更改obj调用它的代码中的属性。

您的问题有两种解决方案。最好的解决方案(IMO)是从handle. 派生自handle的类作为引用传递,因此当您更改 on 的属性时obj,它会随处更改该属性。

但是,如果您不愿意这样做,那么您可以obj从以下位置返回get_some_property

function [some_property,obj] = get_some_property(obj)

然后这样调用get_some_property

[property,obj] = get_some_property(obj);

这会更新obj调用命名空间中的值。它既尴尬又笨拙。handle除非有充分的理由避免它,否则我会从中派生您的课程。

于 2012-07-10T18:05:35.797 回答