2011-09-11 23 views
6

構造体を指定すると、MATLABでクラスを作成する方法はありますか?私は何をしたい、明示的に書き込みファイルを記述することなく、クラスの名前と私はクラスを作成したいフィールドを含む持つ構造体を含む文字列を与えられているインスタンスのmatlabでクラスを動的に作成する

>> p = struct(); p.x = 0; p.y = 0; 
>> p 

p = 

    x: 0 
    y: 0 

>> name = 'Point' 

name = 

Point 

を取ります定義。

class(p)を使用した場合、structを取得します。私がしたいのは、タイプPointのオブジェクトを作成することです。そのとき、class(obj)を実行すると、Pointが得られます。

これを達成するためのアイデアは、どのようにクラス定義でMATLABにファイルを書き込んだ後で実行するのですか?

+0

動的に作成されるクラスは何に必要ですか? – Jonas

+0

@Jonas、私は構造とその情報に関する情報を持つバイナリファイルを持っています。この情報には、クラスの名前、クラスに含まれるフィールド、およびフィールドのデータ型が含まれます。私はこの情報を読んで、MATLABの単純な構造体に格納することができますが、構造体のオブジェクトの型はわかりません。バイナリファイルの命令でこのオブジェクトをオンザフライで構築できるようにしたいと考えています。 – jmlopez

+0

名前が言うように、データが構造体であるところで、 'Name'と' Data'フィールドを持つ構造体配列にデータを格納するとどうなりますか? – Mikhail

答えて

4

あなたが関連付けられた特定の機能(メソッド)を持って次のいずれか何らかの理由であなたがさえxはあなたの特別な構造体の一つであり、それ以外の場合はbuiltin('class', x)を呼び出すかどうかを確認する独自の機能でそれをオーバーロードできclass()使用する必要がある場合Pointクラスではなく、例えばとにかくクラスを手作業で書く必要があります。または、というメソッドを実際に呼び出す必要がない限り、動的に作成できるdynamicpropsクラスを作成して、あなたの人生をはるかに単純化することができます。Lineクラス代わりにclassnameに電話してください。私は過去に使用した

classdef myDynamicClass < dynamicprops 
properties (Hidden) 
myClass %# this stores the class name 
end 
methods 
function obj = myDynamicClass(myClassName,varargin) 
%# synopsis: obj = myDynamicClass(myClassName,propertyName,propertyValue,...) 
%# myClassName is the name of the class that is returned by 'classname(obj)' 
%# propertyName/propertyValue define the dynamic properties 

obj.myClass = myClassName; 

for i=1:2:length(varargin) 
addprop(obj,varargin{i}) 
obj.(varargin{i}) = varargin{i+1}; 
end 
end 

function out = classname(obj) 
out = obj.myClass; 
end 

end 
end 
+0

私はこんな感じです。 'class'を' myDynamicClass'オブジェクトと呼ぶと、私は 'myDynamicClass'を取得します。私はこれを使ってそこに定義されている関数を使って実際のクラス名を調べることができます。これは正しいフィールドがあるかどうかを調べるため、構造体よりも優れた動作をします。ありがとうジョナス、今私はバイナリファイルで指定されたすべてのクラスの別のファイルを書く必要はありません。 – jmlopez

+0

@jmlopez:どうぞよろしくお願いいたします。ダイナミックプロパティのsetメソッドとgetメソッドを作成することもできます。エラーチェック。 – Jonas

+0

「11」に戻って「ああ、本当に?セットを作り、ダイナミックなプロパティのメソッドを得るにはどうすればいい?」と言わねばならなかった。これを行う方法を考えるのを苦労した後、私は[this] //stackoverflow.com/a/20810965/788553)。これはセットメソッドを作成する適切な方法ですか? – jmlopez

1

オブジェクトを動的に作成する方法がわからないため、質問への回答はで、ではありません。フィールドxyclassnameを持つ構造体と

が仕事::その後、

p.x=0; 
p.y=0; 
p.classname='Point'; 

x.classnameを返す関数myclass(x)を書くしかし、あなたの問題を解決するために、私はミハイルが言ったことに非常に似て何かを提案します。

function out=class(varargin) 
if nargin==1 && isstruct(varargin{1}) ... #check if we were given a struct 
    && isfield(varargin{1}, 'classname') ... #...which contains a field classname 
    && ischar(varargin{1}.classname) %# ... which is a string 
    out=varargin{1}.classname; %# ok, our special case :-) 
else 
    out=builtin('class',varargin{:}); %# normal case - call builtin class() 
end 
1

一つの解決策は、この情報(すなわち、クラス名やフィールド)を取り、必要なCLASSDEF構築物を含有するM-ファイルを書き込みMATLAB関数を記述することです。

これは、この情報を使用して、後で拡張するプロトタイプを記述している場合に有効です。

関連する問題