Top > Kinect > KinectForWindowsSDK > Tips > JointCollectionCantMakeAInstance
Last-modified: Mon, 18 Nov 2013 09:25:47 JST
Counter:1260 Today:1 Yesterday:1 Online:9
このエントリーをはてなブックマークに追加

JointCollection は任意のインスタンスを作れない

About

JointCollection のデータを何かしらの形式で一度出力して保存し、再度読み込むことでデータを再利用したい、ということは良くありますが、残念ながら JointCollection は SDKver1.7 までに公開されたコンストラクタを持たず、インスタンス化することができません。これは旧バージョンから続く仕様です。

GetUninitializedObject もダメ

.Netでの開発では、System.Runtime.FormatterServices.GetUninitialized メソッドを利用することで、コンストラクタを持たないクラスのインスタンスを生成したり、コンストラクタで行われる初期化の工程を無視したインスタンスを作ることができますが、JointCollection に関してはこれも意味を成しません。

なぜならばインスタンスそのものは生成できるのですが、肝心のデータである Joint を設定(代入)できないためです。インスタンスだけ作れても値が与えられず、データを保存できないのであれば、実質的に JointCollection のインスタンスを作れたところで無駄でしょう。

一見するとコンストラクタが公開されているように見える現象

次のようなコードを書くと、ビルドを実行するまで、VisualStudio がエラーを通知しないことがあります。

JointCollection jointCollection = new JointCollection();

また "new JointCollection();" の上にマウスカーソルを乗せて表示される補足情報には次のようなテキストが表示されますが、これは公開されないコンストラクタです。

  • "JointCollection.JointCollection(Skeleton backReference)"
  • Initizalize a new Instance of the JointCollection class.

JointCollection クラスの [定義] を表示すると確かにコンストラクタが公開されないことが確認できます。

考察

SDK を利用するプログラマが任意に JointCollection や Skeleton のインスタンスを生成して、Joint を与えることができると、例えば JointCollection[JointType.Head] で取得できる Joint が、確かに頭部を示すことを保証できなくなります。したがって JointCollection の任意のインスタンスが生成できないのだと考えられます。JointCollection から得られるデータを任意に読み書きしたい場合には、JointCollection 以外のクラスを任意に実装して、明確に使い分けてください、という趣旨なのではないでしょうか。