15

在 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

当我clear是类型变量时,Matlab 的默认行为是什么myClass?例如:

>> m = myClass();
>> clear m

我希望Matlabm在这个阶段调用析构函数,但似乎没有!

我的问题:

  1. 变量时如何强制调用析构函数clear

  2. Matlab 的这种默认行为是否有意义?clear在ing 变量时调用析构函数不是更合乎逻辑吗?

  3. Matlab的类是否可能没有detructor方法(即在类被销毁时没有要调用的默认方法)?还是我错过了什么?

  4. 是否可能只有派生自的类handle具有析构函数(delete方法)?

谢谢!

编辑:按照乔纳斯的回答,简要总结:

Matlab 有两种类型的类:值类(默认)句柄类(派生自handle超类)。值类倾向于提供更好的性能,但是,它们没有析构函数功能。

handle类确实有一个析构函数:delete当类被销毁时调用。从类析构函数的更多细节中查看这个问题。handle

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

感谢您的好答案和有见地的评论!

4

1 回答 1

13

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

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

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
于 2012-12-27T16:16:28.277 回答