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 - Fatal编程技术网

Oop 无一例外地取消MATLAB对象构造?

Oop 无一例外地取消MATLAB对象构造?,oop,matlab,Oop,Matlab,在我正在编写的一个MATLAB类中,如果为构造函数提供了0个参数,则会要求用户使用uigetfile提供一个文件。如果用户取消提示,uigetfile返回0。在这种情况下,创建对象是没有意义的。是否有某种方法可以在不引发异常的情况下取消对象构造?如果我提前返回,我会得到一个无法使用的格式错误的对象。下面是代码的样子: classdef MyClass methods function self = MyClass(filename) if narg

在我正在编写的一个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

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

在现代Matlab对象中,我认为不返回构造的对象或抛出错误就不可能离开构造函数。(在旧式类中,构造函数实际上被允许返回它想要的任何东西,包括其他类型的对象或原语,哦,有人可能会把它弄得一团糟。)调用构造函数时,输出参数已经初始化为具有默认属性值的对象,因此当您在那里调用
return
时,它只是跳过其余的初始化并返回对象。如果您试图用MyClass对象以外的对象替换out,那就是一个错误


只需重新组织控制流,将GUI代码从构造函数中拉出,就像您在最后推测的那样。将其混合到构造函数中,尤其是有条件地,可能会导致问题。特别是,Matlab希望zero-arg构造函数总是返回带有某种默认值的标量对象,因为在数组扩展等过程中填充元素时会隐式调用zero-arg。它基本上被用作原型。

是的。只需使构造函数需要一个好的文件名,并将条件内容放在外部。如果你想标准化它,你可以把它放在一个静态工厂方法中。关于MATLAB对象是如何构造的有趣的东西。正如其他人所建议的,我最终从构造函数中删除了用户交互。这也使我的代码变得非常简单,很明显,如果文件名是必须参数,我建议删除所有这些gui内容。您可以通过简单的断言为用户提供帮助:assert(nargin==1,‘必须提供文件名!');