ゲームとそれに付随するエンジンを 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
助けてくれてありがとう!リファクタリングは、うまく機能する場合と同じくらい優れたソリューションです。