因为*refcnt和T *data都为指针类型,所以在class中进行封装为结构体!
template <class T>
class Array
{
private:
struct DataPack//只有在类里面看得见结构体!
{
T* data;
int size;
int refcnt;
};
DataPack* ptr;//在堆空间上new出一个
public:
Array (int sz = 50)
{
assert(sz >= 0)
ptr = new DataPack;
ptr->size = sz;
ptr->data = new T[sz];
ptr->refcnt = 1;
}
Array(const Array<T>& a)
{
ptr = a.ptr;
(ptr->refcnt)++;
}
~Array(void)
{
(ptr->refcnt)--;
if((ptr->refcnt)==0)
{
delete[] (ptr->data);
delete ptr;
}
}
//赋值运算符、getsize都差不多!
void Resize(int se)//不用另开一个内存了!
{
assert(sz >= 0)
if(sz == ptr->size)
return;
T *newData = new T[sz];
int n = (sz < ptr->size) ? sz:ptr->size;
for(inti = 0; i < n; i++)
{
newData[i] = ptr->data[i];//copy到newData
}
delete[] (ptr->data);
ptr->data = newData;
ptr->size = sz;
}
}