当输入是一个对象时,调用Matlab`loadobj`,*在*之前,它成为一个`struct`

时间:2018-07-17 21:13:58

标签: matlab oop

我最初涉足loadobj:我发现了code pattern and explanation

  

如果load函数遇到错误,则loadloadobj传递struct而不是对象

我的加载错误来自使用尚未使用的属性的设置器 已在加载过程中分配给。我想定义一个loadobj 避免上述错误并避免从struct复制的方法 共。我通过按以下顺序设置属性来做到这一点 他们注定要被设置。使用上面的代码模式 网页:

methods(Static)

   function oOut = loadobj(oIn)

      if isstruct( oIn ) % Diagnostic breakpoint set here
         error('Load failed');
      end % if

      % Example code pattern shows input object assigned to output
      % object, but I want to control the order in which
      % properties are assigned to

      oOut.TstepPrYr = oIn.TstepPrYr;
      oOut.TwinYrs = oIn.TwinYrs;
      oOut.Twin1sidePadYrs = oIn.Twin1sidePadYrs;

      % The following properties should have been set by setters
      %     TwinPaddedYrs
      %     TwinPaddedDays
      %     TstepDays
      %     TwinPaddedTsteps % Not used

      % There are also many other properties.  With the key
      % properties set, I should now be able to copy the rest in
      % one shot.

      oOut = oIn;

   end % function

end % methods(Static)

在顶部,我捕获了输入参数为struct的情况。 这种情况会 表示当输入参数为真实对象时,加载失败。 在这种情况下,我不应该继续-应该改用loadobj代码。

由于loadobj以正确的顺序为属性分配值,因此 绝不应该失败,因此,绝不应该使用 struct个参数。不幸的是,我仍然在二传手中犯错 由于属性值不存在。我在顶部放了一个断点 的loadobj来查看输入参数是否确实是struct -是! 因此,loadobj可能甚至没有被真正的对象调用。 我猜想Matlab的默认加载代码(和加载顺序)是 被代替使用。根据{{​​3}}的顶部,这是 不是我应该期望的。

有人可以建议我可以做些什么来进一步解决此问题吗? 万一重要,我的课程是从matlab.mixin.Copyable派生的。

观察到奇怪的行为:如果我使用调试器直接继续执行上述error语句,它将生成Matlab警告而不是错误。但是它仍然存在。

1 个答案:

答案 0 :(得分:0)

我相信您需要在开始初始化属性之前将行oOut = oIn;移到 。默认情况下,变量oOut未初始化为对象;当您开始使用点表示法分配属性时,它将初始化为结构。另外,您可以通过调用构造函数来初始化oOut,然后从oIn移动属性。

oOut = oIn;方法的末尾加上loadobj行,只需将oOut设置为传递的未更改的oIn对象,无需进行任何修改。