4

私はゲームサーバーを持っています。のインスタンスの数を作成しGame、それら(またはそれらへのポインター?何が良いですか?10intsと5の他のポインター、10のメンバー関数)をベクトルに追加します。その後、game_endsなどのいくつかのイベントがゲーム内で発生します。この瞬間、ゲームをベクターから削除する必要があります...それを達成するための最良の方法は何ですか?

私たちがやってきた2つの方法は次のとおりです。

  1. オブザーバーパターンを作成します。サーバーはオブザーバーになり、ゲームはそれを削除するイベントをディスパッチします。

  2. endedサーバーが常にベクトルをスキャンし、状態にあるゲームを削除している間、ゲームを状態に設定しますended

4

4 に答える 4

2

アプリケーションの性質はさておき、オブジェクトをポインタではなく値でベクトルに追加する場合、オブジェクトがベクトルから削除されると、自分でオブジェクトを削除することを心配する必要はありません。オブジェクトを動的に作成し、それらをポインターとしてベクターに追加する必要がある場合は、オブジェクトを削除する責任があります。

于 2012-08-23T22:25:57.613 に答える
2

オブジェクトは、それ自体の存続期間を実際に決定するべきではありません。おそらく、コンテナを所有し、オブジェクトをいつ移動する必要があるかを決定できる、ある種の管理コンテキストが必要です。実際のGame要素は、何らかの形でマネージャーに完了したことを通知する場合がありますが、自分自身を削除したり、コレクションから自分自身を削除したりしないでください。

于 2012-08-23T22:30:00.943 に答える
2

ポインタまたはインスタンス

を使用してポインタを作成する場合は、newそれを削除することを忘れないでください。実インスタンスを使用している場合は、オブジェクトを頻繁にコピーするcopy constructorため、必ずを定義してください。std::vector

を使用できますboost::sharedPointer<Game>std::auto_ptr<Game>と一緒に使用しないでくださいstd::vector

実装オプションから、私は次のことを検討します。

オブザーバーパターンはエレガントですが、何回呼び出されますか?ベクトルからの削除はO(n)になります。これは、それを見つけてから見つける必要があるためですerase

たとえば1分間の最大ゲーム数がわかっていて、それがメモリに収まる場合は、1分ごとにベクトルを繰り返し、endedゲームを削除するスレッドを作成できます。

メモリが重要な場合は、オブザーバーパターンを使用する必要があります。ゲームがたくさんあり、ゲームごとに一意の識別子がある場合は、std::mapの代わりに検討vectorし、オブザーバーパターンを使用してマップから削除できます。O(log(n))

于 2012-08-23T22:48:04.733 に答える
1

オブジェクトまたはオブジェクトゲームへのポインタを作成しますか?

ゲームオブジェクトは大きいですか?他のポインタまたはファイル、ソケット、または他のそのようなものへのポインタが含まれていますか?

これらのいずれかに対する答えが「はい」の場合は、ゲームオブジェクトを新しくし、そのオブジェクトへのポインタを格納する必要があります。

オブザーバーを使用する必要がありますか、それとも常にスキャンする必要がありますか?

これにもっとよく答えるために、私はあなたのプログラムについてもっと知る必要があるでしょう。現在、あなたが行うのに適した設計上の決定のようです。常にスキャンする場合は、スレッドを回転させる必要があります。これはあなたが望むものではないかもしれません。

私は個人的にオブザーバーパターンを使用します。

于 2012-08-23T22:25:17.020 に答える