C++ 如何在c++;
我想写一个通用的对象池类,对象池应该是单例的,在任何地方访问对象池都很容易C++ 如何在c++;,c++,templates,object-pooling,C++,Templates,Object Pooling,我想写一个通用的对象池类,对象池应该是单例的,在任何地方访问对象池都很容易 template <class T> class Pool { T* _freeObjs; public: Pool<T>& getInstance() { static Pool<T> instance; return instance; } T* acquire() { ... }
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;
}
模板
班级池
{
T*_freeObjs;
公众:
池&getInstance()
{
静态池实例;
返回实例;
}
T*acquire(){…}
无效释放(T*obj){…}
私人:
池()
{
_freeObjs=(T*)malloc(sizeof(T)*100);
}
};
福班
{
int i;
公众:
void*运算符新(大小\u t大小)
{
void*p=Pool::getInstance().acquire();
返回p;
}
void运算符删除(void*p)
{
Pool::getInstance().release(p);
}
};
int main()
{
{
Foo*f=新的Foo();
删除f;
}
返回0;
}
但是编译器会显示以下错误消息
错误:无法在没有对象的情况下调用成员函数“Pool&Pool::getInstance()[with T=Foo]”
void*p=Pool::getInstance().acquire()
更新:谢谢你,保罗·麦肯齐
在我将static添加到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:
};
类池对象
{
公众:
void*运算符新(大小\u t大小)
{
void*p=Pool::getInstance().acquire();
返回p;
}
void运算符删除(void*p)
{
Pool::getInstance().release((PooledObject*)p);
}
};
类Foo:公共池对象
{
int i;
公众:
};
您的池和getInstance()
不是静态的。如果要在不创建对象的情况下访问getInstance
,则需要使用static
函数:
static Pool<T>& getInstance()
{
static Pool<T> instance;
return instance;
}
静态池&getInstance()
{
静态池实例;
返回实例;
}
错误消息说您不能将getInstance作为Pool::getInstance调用,它是静态的(没有对象)。getInstance是一个方法,而不是静态的。将GETPATH声明为静态,当您想将其用作静态时。如果它解决了问题,请考虑接受答案: