我尝试修改现有的对象池类,以便我能够将实例创建者类作为参数传递给对象池。基本上我希望能够将实际的对象构造保留在内存池之外,这样我就可以更自由地创建要汇集的实例。
以下是对象池定义:
template <
typename T,
typename InstanceCreator = DefaultInstanceFactory<T>
>
class ObjectPool : private noncopyable {
...
}
所以我会像这样创建一个ObjectPool
ObjectPool<int> intPool((DefaultInstanceFactory<int>()));
或
ObjectPool<IntClass, IntClass::InstanceFactory> intPool (IntClass::InstanceFactory (1));
默认的Instance创建者看起来像这样
template <typename T>
class DefaultInstanceFactory {
public:
T * operator ()() const {
return new T;
}
};
在ObjectPool类中,是一个存储项
的嵌套类class PooledItem {
public:
char data[OBJECT_SIZE];
PooledItem * next;
bool initialized;
PooledItem()
: initialized(false) {}
~PooledItem() {
// --- call T destructor
if (initialized)
cast()->~T();
}
T * cast() {
return reinterpret_cast<T *>(data);
};
};
有一个borrowObject方法来获取一个对象,这是我的实际问题:
T * borrowObject() {
PooledItem * item = getItem();
T * obj = item->cast();
if (! item->initialized) {
// old original line, call the defaut constructor of T
new (obj) T();
// how to integrate the external Instance Creator at this point?
//new (instCreator_ ()) T(1);
//instCreator_ ();
item->initialized = true;
}
if (obj == NULL) {
throw ObjectPoolException(
"Object is NULL!", __FILE__, __LINE__, __FUNCTION__);
}
return obj;
}
在上面的方法中,我标记了实际的问题行。我不知道如何用外部实例创建器替换放置新new (obj) T()
行,只是重用该内存。
为了完整起见,将对象返回池的方法如下所示
void returnObject(T * obj) {
// --- Get containing PooledItem pointer
PooledItem * item = reinterpret_cast<PooledItem *>(obj);
// --- Make sure object came from this pool
if (item->next != reinterpret_cast<PooledItem *>(this)) {
// throw Exception
}
// --- Destroy object now if we want to reconstruct it later
if (destroyOnRelease) {
item->cast()->~T();
item->initialized = false;
}
是否有人可以帮助我如何修改方法以便外部Instance Creator正确集成?到目前为止我还不知道,如果我需要在returnObject方法中进行更改,到目前为止我认为不是。
感谢您的帮助!
答案 0 :(得分:0)
听起来你需要更改InstanceFactory的签名以获取指针
template <typename T>
class DefaultInstanceFactory {
public:
void operator ()(T* out) const {
return new(out) T;
}
};