它调用 add_to_freelist 成员将被删除对象放回自由列表。
令人感兴趣的部分是强制类型转换。在删除动态分配的类类型对象时调用 operator delete,编译器将该对象的地址传给 operator delete。但是,指针的形参类型必须是 void*,在调用 add_to_freelist 之前,必须将指针从 void* 强制转换为它的实际类型,本例中,那个类型是指向 T 的指针,它是 CachedObj 派生类型的对象的指针。
6.add_to_freelist成员
这个成员的任务是设置next指针,并且在将对象加到自由列表时更新freeStore指针:
templatevoid CachedObj ::add_to_freelist(T *p) { p -> CachedObj ::next = freeStore; freeStore = p; }
为了避免任何与派生类中定义的成员可能的冲突,显式指定我们正在给基类成员 next 赋值。
7.定义静态数据成员
templatestd::allocator CachedObj ::alloc_mem; template T *CachedObj ::freeStore = 0; template const std::size_t CachedObj ::chunk = 24;
照常,对于类模板的静态成员,每个类型使用不同的静态成员来实例化 CachedObj 类。将 chunk 初始化为任意值,本例中为 24。将 freeStore 指针初始化为 0,指出自由列表开始时为空。alloc_mem 成员不需要初始化,但必须记得定义它。
//P646 习题18.10 源代码修改之后
class iStack
{
public:
iStack(int capacity):stack(capacity),top(0) {}
iStack():top(0) {}
private:
vector
stack;
int top;
};
int main()
{
iStack *ps = new iStack(20);
const iStack *ps2 = new const iStack(15);
iStack *ps3 = new iStack[100];
}