オブジェクトを作成した後保管し、使うときに引っ張ってくるようなクラスを作りました
適当に作ったのでこれでいいのかもわかりませんがまぁ参考になるようならしてやってください
ぶっちゃけstd::listで作ってもいい気がしますがその辺は気にしない方向で
ソースは長ったらしいので使い方を乗せときます
また、グローバル変数を使っていいのならnew/deleteオペレータをオーバーライドしたほうがわかりやすいプログラムになると思います
そうすれば、予備領域確保するだけで違うクラスでも保管庫クラスに保管できますし
main.cpp
#include <iostream>
#include "reservoir.h"
///////////////////////////////////////////////////////////////
class CTestObject:public IBaseReserveObject
{
private:
enum eStatus
{
STATUS_CONSTRUCTOR,
STATUS_CREATE,
STATUS_INITIALIZE,
STATUS_FINALIZE,
STATUS_DESTROY,
};
//
eStatus m_Status;
public:
CTestObject(void)
{
m_Status=STATUS_CONSTRUCTOR;
}
~CTestObject(void)
{
;
}
protected:
bool OnCreate(void* pParam)
{
m_Status=STATUS_CREATE;
return true;
}
bool OnInitialize(void* pParam)
{
m_Status=STATUS_INITIALIZE;
return true;
}
bool OnFinalize(void)
{
m_Status=STATUS_FINALIZE;
return true;
}
bool OnDestroy(void)
{
m_Status=STATUS_DESTROY;
return true;
}
};
///////////////////////////////////////////////////////////////
int main(int Argc,char* Argv[])
{
//
CReservoir<CTestObject> Res;
Res.Initialize(100,NULL);
//
CTestObject* pObject=Res.GetNewActiveObject(NULL);
CReservoirIterator<CTestObject> It=Res.GetActiveObjectIterator();
++It;
SAFE_RELEASE(pObject);
++It;
--It;
bool Result=It.IsEnd();
//
Res.Finalize();
//
return 0;
}
この例ではまず、IBaseReserveObjectの派生クラスとなるCTestObjectを実装してます
あとはCReservoir<CTestObject>を作ればできあがり
CReservoir<>::GetNewActiveObject関数でオブジェクトを取ってきてRelease関数で開放できます
注意としてCReservoir<>::GetActiveObjectIterator()関数で取るイテレータは、
環状リストを用いているので、最初に示しているのはアクティブなオブジェクトのリストのダミーです
(つまりイテレータをはじめに1進めないといけない)
最終更新:2009年06月12日 09:37