2017-03-28 59 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