Nested classdef with or without handle? [duplicate]

核能气质少年 提交于 2020-01-24 09:16:05

问题


I am trying to used updatable object (class) in Matlab with nested class. I observe a behavior that seems to be due to the handle status.

I write the 2 classes testA and testB. testB is a the main class that calls the class testA as a property:

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

Firstly, testA is a handle class.

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

When I create testB object two times

tt=testB
tt=testB

I observe that the val property in testA is not reinitialized (val in testA keeps the previous value). I am not sure but it seems to be due to the handle feature. The method tt.up increase the val property in testA as expected.

Secondly if I change the testA class to a value class.

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

In this case the successive calls of tt=testB create each time a new instance of testB with a new instance of testA. Unfortunately in this case the up methods does not work as expected (the new computed value of val is not stored in the object).

A solution could be to consider handle class for testA and force to delete it before fully initialize the testB object. However I don't know how to do this.


回答1:


This is documented behavior: in your testB definition, obj=testA is evaluated only once, when the class definition is loaded. All instances of the class will have a reference to the same handle class object.

Just below on same documentation page you'll see that you should create a new instance of testA in the constructor for testB, if you want a different instance of testA for each instance of testB:

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


来源:https://stackoverflow.com/questions/58169408/nested-classdef-with-or-without-handle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!