0

私はシミュレーションフレームワークを使用しています。生成される各パーティクルには、UserInfoオブジェクトへのポインタ用のスロットがあります(したがって、必要な情報をパーティクルに添付できます)。問題は、パーティクルが強制終了されるたびに、フレームワークがこのユーザー情報を削除することです。何百万ものパーティクルがあり、多くの場合情報が重複しているため、情報が異なる場合にのみ新しいUserInfoオブジェクトを作成したいと思います。もちろん、問題は、パーティクルが強制終了されるたびに、ポインタを持つUserInfoオブジェクトが削除されることです(同じオブジェクトが他のパーティクルにもアタッチされているかどうかは関係ありません)。

パーティクルが強制終了されたときにパーティクルがUserInfoオブジェクトを削除しないようにするには、どのような手順を実行する必要がありますか?UserInfoクラスに対して参照カウントとオーバーロード削除を行う必要があることに気付きました。ただし、これまで削除をオーバーロードしたことがないので、いくつか質問があります。

  1. 次のようなクラス階層がある場合:

    class VirtualUserInfo;
    class A : public VirtualUserInfo;
    class B : public A
    ...etc
    

    クラスAでdeleteをオーバーロードしますが、VirtualUserInfoへのポインターまたはクラスBへのポインターでdeleteが呼び出された場合、機能しますか?(同様に、正しく機能するためにnewをオーバーロードするにはどうすればよいですか?新しい派生クラスごとにnewを再度オーバーロードする必要がありますか?)

  2. 不思議なことに繰り返されるテンプレートパターンを使用して、参照カウントを行うのは簡単です。このようなミックスインスタイルの方法で削除動作を含める方法はありますか?このタイプの動作を、私が作成するすべてのタイプのUserInfoに適用すると便利です。

  3. 私がやりたいことをするためのよりクールでより良い方法はありますか?

4

2 に答える 2

0

ラッパー クラスが必要な理由がわかりません... Particle クラスのインターフェイスを本当に変更できないのでしょうか? ユーザー情報へのポインター部分は、次のようになります。

class Particle {
   std::shared_ptr<VirtualUserInfo> mpUserInfo;
public:
   Particle(std::shared_ptr<VirtualUserInfo> UserInfo):
      mpUserInfo(UserInfo)
   {}
};

自分で実装しようとするとstd::shared_ptr、 で既に利用可能なものを複製するだけであり、インターフェイスを変更するよりも多くの作業が必要になる可能性があります。

于 2015-08-20T16:57:11.807 に答える
0

なぜcrtpが必要なのですか?? 新しい標準またはブースト ライブラリで shared_ptr を使用できます。また、コンパイラがブーストまたは新しい標準をサポートしていない場合は、独自の参照カウント スマート ポインターを実装することもできます。こちらをご覧ください: http://code.google.com /p/tnnlib/source/browse/trunk/%20tnnlib/ユーティリティ/ユーティリティ/SmartPtr/SmartPtr.h

于 2012-02-28T09:51:51.070 に答える