2017-03-28 3 views
1

"PathObj_Standard"라는 사용자 정의 클래스를 사용하고 있습니다. 이 클래스를로드 할 때 CalcDate 속성을 셀 배열로 저장하면 표준 배열로 변환됩니다. 그러나 얼마 전 클래스 정의를 변경 했으므로 loadobj 함수를 사용하면 객체 대신 구조체가 생성됩니다. 내가 사용하고있는 원래 코드는 훨씬 더 많은 속성을 가지고 있으므로 구조체의 속성을 새 개체에 할당하여 새 개체를 만들지는 않을 것입니다. 또한 struct를 인수로 받아들이도록 생성자를 변경하는 것을 주저합니다.구조체를 MATLAB loadobj 함수에서 객체로 강제 변환

클래스 함수를 사용하여 loadobj에서 시도했지만 클래스를 지우지 않고 '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에서 클래스를 구성하는 가장 쉬운 방법은 자동으로 MATLAB의 그래픽의 setget 방법을 가지고로 hgsetget보다는 handle에서 상속하는 것입니다 이러한 메서드는 struct의 형식으로 속성/값을 사용할 수 있습니다. 이렇게하면, 당신은 당신의 loadobj 방법을 변경할 수

classdef PathObj_Standard < hgsetget 

MATLAB의 최신 버전, 당신은 또한

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 
같은 뭔가 할 수 SetGet 믹스 인을 사용할 수 있습니다