取消MATLAB对象构造没有例外?

AE4*_*082 3 oop matlab

在我写的MATLAB类中,如果构造函数被赋予0参数,则要求用户使用提供文件uigetfile.如果用户取消提示,则uigetfile返回0.在这种情况下,制作对象毫无意义.有没有办法在不抛出异常的情况下取消对象构造?如果我提前返回,我会得到一个无法使用的格式错误的对象.这是代码的样子:

classdef MyClass
    methods
        function self = MyClass(filename)
            if nargin == 0
                filename = uigetfile;
                if filename == 0
                    %cancel construction here
                    return; %I still get a MyClass object with self.filename == []
                end
            end   
            self.filename = filename;
        end
    end

    properties
        filename;
    end
end
Run Code Online (Sandbox Code Playgroud)

但是我不确定uigetfile在构造函数中使用是否正确.也许它应该是我的代码的另一部分的责任.

And*_*nke 5

在现代的Matlab对象中,我认为如果不返回构造对象或抛出错误,就不可能离开构造函数.(在旧样式类中,构造函数实际上被允许返回它想要的任何内容,包括其他类型的对象或基元,并且可能会导致混乱.)当调用构造函数时,输出参数已经初始化使用具有默认属性值的对象,因此当您return在那里调用时,它只是跳过剩余的初始化并返回该对象.如果你试图用MyClass对象之外的东西替换,那就是一个错误.

只需重新组织控制流,将GUI代码从构造函数中拉出来,就像最后推测的那样.将其混合到构造函数中,特别是有条件地,可能会导致问题.特别是,Matlab期望零参数构造函数始终返回具有某种默认值的标量对象,因为在数组扩展期间填充元素时会隐式调用zero-arg,依此类推.它基本上用作原型.