Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Matlab:清除期间未调用类析构函数?_Oop_Matlab_Destructor - Fatal编程技术网

Oop Matlab:清除期间未调用类析构函数?

Oop Matlab:清除期间未调用类析构函数?,oop,matlab,destructor,Oop,Matlab,Destructor,在Matlab中,我有一节课 classdef myClass properties % some properties here... end methods ( Access = 'public' ) function obj = myClass() % constructor... end function obj = delete( obj ) % su

在Matlab中,我有一节课

classdef myClass
    properties
       % some properties here...
    end
    methods ( Access = 'public' )
        function obj = myClass()
            % constructor...
        end
        function obj = delete( obj )
             % suppose to be destructor...
             fprintf(1, 'delete\n');
        end
    end % public methods
end
当我清除类型为myClass的变量时,Matlab的默认行为是什么? 例如:

>> m = myClass();
>> clear m
我希望Matlab在这个阶段调用
m
的析构函数,但它似乎没有

我的问题:

  • 清除
    变量时,如何强制调用析构函数

  • Matlab的这种默认行为有意义吗?当
    清除
    变量时调用析构函数不是更合乎逻辑吗

  • Matlab的类是否可能没有Destructor方法(也就是说,当类被销毁时没有要调用的默认方法)?还是我遗漏了什么

  • 是否只有从
    handle
    派生的类才有析构函数(delete
    方法)

  • 谢谢

    编辑:以下是一个简要总结:

    Matlab有两种类型的类:和。值类倾向于提供更好的性能,但是,它们没有析构函数功能

    handle
    类确实有一个析构函数:
    delete
    ,该函数在类被销毁时调用。有关
    句柄
    类析构函数的更多详细信息,请参见

    如果希望为值类提供类似析构函数的功能,Jona的回答提出了一种利用
    onCleanup
    功能的方法

    谢谢你的回答和有见地的评论

    仅定义为句柄类的类析构函数,而不是值类(因此,Q4的答案是“是”,请参阅前面的文档链接)。值类的工作方式非常类似于标准的Matlab数组,因为它们是通过值传递的,而不是通过引用传递的,而且许多内部构件(如析构函数)对用户是隐藏的。作为交换,它们通常更快(参见示例)

    因此,如果您希望调用delete方法,我建议您使用该功能(请注意,
    delete(m)
    实际上不会删除任何内容,因此您可能希望将其设置为私有方法)


    可能重复:@DennisJaheruddin-我怀疑这两个问题是相关的,但不是重复的,因为这里的讨论涉及从
    handle
    超类派生的类。我同意Shai的观点,这是一个不同(而且有趣)的问题。本页底部似乎有一些关于最后问题的相关信息@丹尼斯·杰鲁丁-我会调查的-谢谢!谢谢你的回答。然而,难道没有更直接的方法来定义在类实例被删除/清除时调用的析构函数吗?我更像是一个C++ OOP人,所以我真的不明白为什么MATLAB正在使这个析构函数不那么重要…@ SaaI:如果你来自C++ OOP,我建议使用句柄类而不是值类——析构函数按预期工作,你通过引用,这两个都是你希望从C++中得到的特征。@ Shai:我已经扩展了我的答案来明确地触摸问题3和4。
    classdef myTestClass
        properties
           % some properties here...
        end
        properties (Hidden)
            cleanup
        end
        methods ( Access = 'public' )
            function obj = myTestClass()
                % constructor...
                obj.cleanup = onCleanup(@()delete(obj));
            end
        end 
        methods ( Access = 'private' )
            %# I suggest hiding the delete method, since it does not
            %# actually delete anything
            function obj = delete( obj )
                 fprintf(1, 'delete\n');
            end
        end % public methods
    end