2017-03-28 1 views
1

"PathObj_Standard"という名前のカスタム定義クラスで作業しています。私は、このクラスをロードするときに、プロパティCalcDateがセル配列として保存されていれば、それが標準配列に変換されることを確認したいと思います。しかし、以前はクラスの定義を変更していましたので、loadobj関数を使用すると、オブジェクトの代わりに構造体が取得されています。私が使用している元のコードは、より多くのプロパティを持っているので、新しいオブジェクトに構造体のプロパティによってプロパティを割り当てることによって、新しいオブジェクトを作成したくないでしょう。さらに、構造体を引数として受け入れるようにコンストラクタを変更することも躊躇しています。MATLAB loadobj関数のstructからオブジェクトへの強制変換

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内から行うことができないクラスを作成することです。それは自動的にMATLABのグラフィックスのsetgetメソッドを持っているとして、あなたは私の経験でも

実際コンストラクタを呼び出すことになるでしょう、structからクラスを構築する最も簡単な方法は、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ミックスインを使用することができます
関連する問題