gpt4 book ai didi

c++ - 如何在C++中编写通用对象池

转载 作者:行者123 更新时间:2023-12-02 10:09:18 25 4
gpt4 key购买 nike

我想编写一个通用对象池类,并且对象池应该是单例的,很容易在任何地方访问该对象池。

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]”
无效* 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。如果要在不创建对象的情况下访问static,则它必须是getInstance函数:

static Pool<T>& getInstance()
{
static Pool<T> instance;
return instance;
}

关于c++ - 如何在C++中编写通用对象池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64289766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com