質問

私は 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_ptrInstance. 。そんなことは全然関係ないよ 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 のエントリも参照してください。 「初期化中の動的バインディング」, これは直接関係はありませんが、コンストラクターでの仮想関数の使用に関する制限を回避するために同じ手法を使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top