std::set<boost::shared_ptr> の維持
-
21-09-2019 - |
質問
私は C++ でゲームとそれに伴うエンジンを書いています。このエンジンは、単純な組み込みスクリプト言語を使用した自動化に大きく依存しています。スクリプトは、オブジェクト クラスを作成し、それらにイベント リスナーを定義し、それらからインスタンスを生成できます。現時点では、インスタンスの存在を維持するには、インスタンスをスクリプト グローバル識別子にバインドする必要があります。この明らかな結果は、匿名オブジェクトが存在できないということであり、これが最も一般的です。
現在、インスタンスは std::set<Instance*, spatial_sort>
, 、 どこ spatial_sort
レンダリングと衝突検出のために、インスタンスを位置によって並べ替えるファンクターです。インスタンスは、50 分の 1 秒以内に大きく移動する可能性は低いという想定の下、現在の位置をヒントとして使用してフレームごとに削除され、再挿入されます。もし dead
フラグがインスタンスに設定されると、セットから削除されます。の Instance
コンストラクターとデストラクターの呼び出し insert(this)
そして erase(this)
, 、 それぞれ。
匿名インスタンスを許可するには、セットを std::set<boost::shared_ptr<Instance>, spatial_sort>
, 、これにより、 Instance
インスタンスの所有権を共有し、インスタンスが自身を破壊するまでその存在を維持します。残念ながら、 insert()
コンストラクターに配置する必要があります。 shared_from_this()
を取得するには機能しません shared_ptr
に Instance
. 。そんなことは全然関係ないよ Instance
すでにから継承している boost::enable_shared_from_this<>
その基本クラスを介して。
誰かが適切な回避策を推奨できますか?
編集:
私は最初にやるべきことを行い、メンバーの行動を分割しました。 Instance
クラスを 2 つのクラスに分割します。 Instance
そして Reference
. 。表現 new SomeClass
スクリプト内で Reference
新しいものへ Instance
. 。の Instance
オブジェクト自体は、 shared_ptr
, したがって、アニメーションの終了、レベルの終了など、適切なイベントに応じて自殺する責任があります。
助けてくれてありがとう!リファクタリングは、うまく機能するのであれば、他のソリューションと同様に優れたソリューションです。
解決
静的メソッドを追加できます Instance
これを使用して新しいオブジェクトを作成し、セットへの追加などの管理作業も行います。
static Instance* create(int something) {
boost::shared_ptr<Instance> sptr(new Instance(something));
instanceset.insert(sptr);
return sptr.get();
}
これをこのクラスのオブジェクトを構築する唯一の方法にしたい場合は、通常のコンストラクターをプライベートまたはプロテクトにすることもできます。
詳細については、C++ FAQ Lite のエントリも参照してください。 「初期化中の動的バインディング」, これは直接関係はありませんが、コンストラクターでの仮想関数の使用に関する制限を回避するために同じ手法を使用します。