【问题标题】:Force conversion of struct to object in MATLAB loadobj function在 MATLAB loadobj 函数中强制将结构转换为对象
【发布时间】:2017-08-21 18:42:26
【问题描述】:

我正在使用一个名为“PathObj_Standard”的自定义类。我想确保当我加载这个类时,如果属性 CalcDate 被保存为一个单元格数组,它将被转换为一个标准数组。但是,我前段时间更改了类定义,所以当我使用 loadobj 函数时,我得到的是一个结构而不是一个对象。我使用的原始代码具有更多属性,因此我宁愿不通过将结构中的属性分配给新对象来创建新对象。此外,我也不愿更改构造函数以接受结构作为参数。

我尝试在 loadobj 中使用类函数,但我得到一个 Cannot redefine class 'PathObj_Standard' without a call to 'clear classes' 错误。这个函数不应该强制将结构转换为对象吗?为什么它在 loadobj 函数中不起作用?

classdef PathObj_Standard < handle

properties (SetAccess = protected)
    CalcDate;      
    Name;
end
methods(Static)
    function obj=loadobj(s)
        if isstruct(s)
            obj=class(s,'PathObj_Standard');
        else
            obj=s;
        end
        if not(isempty(obj.CalcDate)) && iscell(obj.CalcDate)
            obj.CalcDate=cell2mat(obj.CalcDate);
        end
    end
end
methods
    function obj=PathObj_Standard(Name,CalcDate)
        obj.Name=Name;
        obj.CalcDate=CalcDate;
    end
end

【问题讨论】:

    标签: matlab class oop object matlab-struct


    【解决方案1】:

    问题在于调用class 会尝试创建一个类,而这在loadobj 中是无法做到的。您需要调用 actual 构造函数

    根据我的经验,从struct 构造类的最简单方法是从hgsetget 继承而不是handle,因为它自动具有MATLAB 图形对象的setget 方法和这些方法可以接受struct 形式的属性/值。在较新版本的 MATLAB 中,您还可以使用 SetGet mixin

    classdef PathObj_Standard < hgsetget
    

    如果您这样做,您可以将 loadobj 方法更改为类似

    function obj = loadobj(s)
    
        % Update the input struct as needed
        if isfield(s, 'CalcDate') && ~isempty(s.CalcDate) && iscell(s.CalcDate)
            s.CalcDate = cell2mat(s.CalcDate);
        end
    
        % Call the default constructor
        obj = PathObj_Standard();
    
        % Update all properties that were supplied to loadobj
        set(obj, s)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 2011-01-01
      • 1970-01-01
      • 2012-05-31
      • 2012-05-30
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多