[英]How to write an generic object pool in c++
我想編寫一個通用的對象池類,對象池應該是單例的,很容易在任何地方訪問該對象池。
template <class T>
class Pool
{
T* _freeObjs;
public:
Pool<T>& getInstance()
{
static Pool<T> instance;
return instance;
}
T* acquire() { ... }
void release(T* obj) { ... }
private:
Pool()
{
_freeObjs = (T*)malloc(sizeof(T) * 100);
}
};
class Foo
{
int i;
public:
void* operator new(size_t size)
{
void * p = Pool<Foo>::getInstance().acquire();
return p;
}
void operator delete(void * p)
{
Pool<Foo>::getInstance().release(p);
}
};
int main()
{
{
Foo* f = new Foo();
delete f;
}
return 0;
}
但編譯器顯示以下錯誤消息,
錯誤:無法在沒有對象的情況下調用成員函數 'Pool& Pool::getInstance() [with T = Foo]'
void * p = Pool::getInstance().acquire();
更新:謝謝,PaulMcKenzie 在我向 getInstance() 函數添加靜態之后,代碼就可以工作了。
現在,我將重載運算符 new/delete 移到基類,如果我的以下代碼有任何問題?
class PooledObject
{
public:
void* operator new(size_t size)
{
void * p = Pool<PooledObject>::getInstance().acquire();
return p;
}
void operator delete(void * p)
{
Pool<PooledObject>::getInstance().release((PooledObject*)p);
}
};
class Foo : public PooledObject
{
int i;
public:
};
您的Pool<T>& getInstance()
不是static
。 如果你想在沒有創建對象的情況下訪問getInstance
它需要是一個static
函數:
static Pool<T>& getInstance()
{
static Pool<T> instance;
return instance;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.