2

ゲームとそれに付随するエンジンを C++ で書いています。エンジンは、単純な埋め込みスクリプト言語を使用した自動化に大きく依存しています。スクリプトは、オブジェクト クラスを作成し、それらにイベント リスナーを定義し、それらからインスタンスを生成できます。現在、インスタンスの存在を維持するには、インスタンスをスクリプト グローバル識別子にバインドする必要があります。これの明らかな結果は、無名オブジェクトが存在できないということです。これは、最も一般的なものです。

現在、インスタンスは を使用して管理されていますstd::set<Instance*, spatial_sort>。ここで、spatial_sortは、レンダリングと衝突検出のために、インスタンスを位置でソートするファンクタです。インスタンスは、現在の位置をヒントとして使用して、フレームごとに削除され、再挿入されます。これは、インスタンスが 50 分の 1 秒で大きく移動する可能性が低いという前提の下で行われます。インスタンスにフラグが設定されている場合、deadフラグはセットから消去されます。Instanceコンストラクタとデストラクタは、それぞれinsert(this)とを呼び出しerase(this)ます。

匿名インスタンスを許可するために、セットを a に変更したいと考えていますstd::set<boost::shared_ptr<Instance>, spatial_sort>。これによりInstance、インスタンスの所有権を共有し、インスタンスが自分自身を破壊するまで存在を維持できます。残念ながら、 への呼び出しinsert()はコンストラクターに配置する必要があるため、へのshared_from_this()を取得するためには機能しません。基本クラスを介してすでに継承されていることはまったく問題ではありません。shared_ptrInstanceInstanceboost::enable_shared_from_this<>

誰でも適切な回避策を推奨できますか?

編集:

最初にすべきことを行い、クラスの動作を と の 2 つのクラスに分割しましInstanceた。スクリプト内の式は、新しい にa を返します。オブジェクト自体は を使用して管理されることはないため、アニメーションの終了、レベルの終了などの適切なイベントに応答して自殺する責任があります。InstanceReferencenew SomeClassReferenceInstanceInstanceshared_ptr

助けてくれてありがとう!リファクタリングは、うまく機能する場合と同じくらい優れたソリューションです。

4

1 に答える 1

2

新しいオブジェクトを作成するために使用する静的メソッドを追加できInstanceます。これにより、セットへの追加などの管理作業も実行されます。

static Instance* create(int something) {
  boost::shared_ptr<Instance> sptr(new Instance(something));
  instanceset.insert(sptr);
  return sptr.get();
}

これをこのクラスのオブジェクトを構築する唯一の方法にしたい場合は、通常のコンストラクターをプライベートまたは保護することもできます。

詳細については、「初期化中の動的バインディング」に関する C++ FAQ Lite のエントリも参照してください。これは直接関連していませんが、同じ手法を使用して、コンストラクターでの仮想関数の使用に関する制限を回避します。

于 2010-01-19T06:33:46.840 に答える