带或不带句柄的嵌套 classdef?

Nested classdef with or without handle?

我正在尝试在带有嵌套 class 的 Matlab 中使用可更新对象 (class)。我观察到似乎是由于句柄状态引起的行为。

我写了 2 classes testAtestBtestB 是主要的 class 调用 class testA 作为 属性:

classdef testB 
    properties
        objA=testA;
    end
    methods
        function obj=testB()
            obj.objA
            if isempty(obj.objA.val)
                obj.objA.val=5;
            else
                 obj.objA.val=obj.objA.val+5;
            end
        end
        function up(obj)
            obj.objA.val=obj.objA.val+6;
            obj.objA.val
        end
    end
end

首先,testA是句柄class。

classdef testA < handle 
    properties
        val=[];
    end
    methods
        function obj=testA()
        end
        function set.val(obj,tt)
            obj.val=tt;
        end
    end
end

当我两次创建 testB 对象时

tt=testB
tt=testB

我观察到 testA 中的 val 属性 没有重新初始化(testA 中的 val 保持以前的值)。我不确定,但这似乎是由于 handle 功能。方法 tt.up 增加 val 属性 in testA 符合预期。

其次,如果我将 testA class 更改为值 class。

classdef testA  
    properties
        val=[];
    end
    methods
        function obj=testA()
        end
        function obj=set.val(obj,tt)
            obj.val=tt;
        end
    end
end

在这种情况下,tt=testB 的连续调用每次都会创建 testB 的新实例和 testA 的新实例。不幸的是,在这种情况下,up 方法无法按预期工作(val 的新计算值未存储在对象中)。

一个解决方案可能是考虑 handle class testA 并在完全初始化 testB 对象之前强制删除它。但是我不知道该怎么做。

这是 documented behavior:在您的 testB 定义中,obj=testA 仅在加载 class 定义时计算一次。 class 的所有实例都将引用同一个句柄 class 对象。

只是 below on same documentation page 你会看到你应该在 testB 的构造函数中创建一个 testA 的新实例,如果你想要一个不同的 testA 实例对于 testB 的每个实例:

classdef testB 
    properties
        objA
    end
    methods
        function obj=testB()
            objA = testA;
            % ... further initialization
        end
    end
end