1

Figure ハンドルを格納するクラスがあります。新しい Matlab ハンドル グラフィックス hg2 を使用すると、「削除された図へのハンドル」エラーが発生します。

classdef mytestclass
    properties
        hFig = figure
    end
end

クラスのインスタンスを 1 つだけ作成しても問題なく動作します。有効な Figure ハンドルとして a.hFig を取得します。

a = mytestclass % this will open the figure

しかし、図を閉じてクラスの別のインスタンスを作成すると、

b = mytestclass % this won't open any figure
b.hFig % this is now a handle to a deleted figure

クラスで何か間違ったことをしていますか?それともこれはバグですか?

4

1 に答える 1

1

私はMatlab 2009a(新しいHG2のずっと前)であなたの例を試しましたが、動作はあなたが説明したものとまったく同じです.

classesMatlabでの作業方法に少し間違っているようです。

基本的に、プロパティのデフォルト値に任意のタイプの数値/テキスト値を割り当てることができます。

properties
   myProp %// No default value assigned
   myProp = 'some text'; 
   myProp = sin(pi/12); %// Expression returns default value
end

ただし、ハンドルを何かに割り当てないでください

myProp1 = figure ;       %// all the object of this class will always point to this same figure
myProp2 = plot([0 1]) ;  %// all the object of this class will always point to this same line object

そうしないと、クラスのすべてのオブジェクト (新しく作成されたものも含む) が、最初のオブジェクトがインスタンス化されたときに一度だけ作成された同じ実際のハンドルを指します。

クラスの新しいオブジェクトを作成するたびに異なるグラフィック オブジェクト ( figure ) を生成する場合は、クラス コンストラクターで生成する必要があります。

したがって、クラスは次のようになります。

classdef mytestclass
   properties (SetAccess = private) %// you might not want anybody else to modify it
      hFig
   end
   methods
      function obj = mytestclass()
         obj.hFig = handle( figure ) ; %// optional. The 'handle' instruction get the actual handle instead of a numeric value representing it.
      end
   end
end

ヘルプから:

プロパティを一意の値に初期化する

MATLAB は、クラス定義が読み込まれるときに一度だけ、指定された既定値にプロパティを割り当てます。したがって、 プロパティ値ハンドル クラス コンストラクターで初期化すると、MATLAB はこのコンストラクターを 1 回だけ呼び出し、すべてのインスタンスが同じハンドル オブジェクトを参照します。オブジェクトを作成するたびにプロパティ値をハンドル オブジェクトの新しいインスタンスに初期化する場合は、コンストラクターでプロパティ値を割り当てます。

于 2014-11-15T14:37:13.750 に答える