2017-03-28 55 views
1

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

我尝试使用loadobj中的类函数,但我得到一个无法调用'clear classes'错误时无法重新定义类'PathObj_Standard'。这个函数是否应该强制将结构转换为对象?为什么它在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 

回答

2

的问题是,调用class尝试创建一个类你不能从你的loadobj内完成。你要叫实际构造

而且以我的经验,从struct构造一类最简单的方法是从hgsetget而不是handle继承为自动拥有的MATLAB的图形setget方法对象和这些方法可以接受struct形式的属性/值。在MATLAB中的新版本,你也可以使用SetGet混入

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 
相关问题