私のクラスの1つは、テンプレートのメモリプール構造を使用してクラスの新しいインスタンスの割り当てを処理し、それらをまとめて維持するプログラムを作成しています。新しい機能を友人機能としてオーバーロードしていますか?
T
はこのプールを作成するクラスであり、
N
がプールに配置できる要素の最大数である
template<typename T, unsigned int N>
class MemoryPool
{
//Stuff
};
を次のように現在では、宣言されています。私はそれが合理的なことならば、プールとのやりとりを少し簡単にするために、作成されたタイプのためにnew
をオーバーロードしたいと思います。
私の考えでは、現在、それはそれはそこからなんとかする必要がありますMemoryPool
内T
ためのフレンド関数としてnew
をオーバーロードすることは可能ですが、場合、私はわからないということです。そして、私はそれを設定する最善の方法がわからない。私はちょうどオーバーロードされたnew
を宣言するためにいくつかの異なる方法を試しました。そして、それを実装する前にエラーが発生しています。
- これは
MemoryPool
を使用するすべてのクラスでnew
が確実に上書きされるようにするための合理的な方法ですか? - そうでも可能ですか?
- これはいい考えですか?
- どのように私はこれを達成するための関数宣言を設定するのですか?
私は、Visual Studio 2010
注意、テンプレートの特定の使用を使用してnew
をオーバーロードしています、重要なケースでは、宿題のない一部です。残りの課題を将来のために読みやすくすることが可能な場合は、それを実装する方法だけです。だから、それを行う合理的な方法がない場合、私はちょうど同じ目標を達成するためにMemoryPool
内のメンバー機能を使用します。
ありがとうございます!
実装例:この例では
MemoryPool<Object, MAX_OBJECTS> objectPool; //Pool to store objects
Object* allObjects[MAX_OBJECTS]; //Locations of objects
//Make a new object (this is how I'd like to do it)
allObjects[0] = new Object(/*args*/);
//(If I can't do the above, this would be the alternative)
allObjects[0] = objectPool.AllocateNewSlot();
allObjects[0]->Initialize(/*args*/);
、MemoryPool
の使用は、オブジェクトが代わりにちょうどどこヒープ上のプールに作成され確保new
の実際の実装の世話をする(すべて確保しますオブジェクトは、集中、より制御可能な場所にある。
私はあなたがしたいことを理解していません。どのように使用したいかの例を追加できますか? – ronag
@ronagサンプル実装で更新されました。それは役に立ちますか? – chaosTechnician
std :: shared_ptrまたはunique_ptrでカスタムアロケータ/デリータを使用しないのはなぜですか? – Rick