13-4 指向const Array 的Pointer
还有一点障碍:我们不能使 Pointer指向const Array 的元素。
template class Ptr_to_const {
public:
// const Array&, 而不是Array&
Ptr_to_const(const Array& a, unsigned n = 0):
ap(a.data), sub(n) { ++ap->use; }
Ptr_to_const():ap(0), sub(0) {}
Ptr_to_const(const Ptr_to_const& p):
ap(p.ap), sub(p.sub)
{
if(ap)
++ap->use;
}
~Ptr_to_const() {
if(ap &&--ap->use ==0)
delete ap;
}
Ptr_to_const& operator =(const Ptr_to_const& p) {
if(p.ap)
++p.ap->use;
if(ap && --ap->use == 0)
delete ap;
ap = p.ap;
sub = p.sub;
return *this;
}
// const T& , 而不是T&
const T& operator*() const {
if(ap == 0)
thorw "* of unbound Ptr_to_const";
return (*ap)[sub];
}
private:
Array_data* ap;
unsigned sub;
};
13-5 有用的增强操作
resize 和reserve操作。
template class Array {
public:
void resize(unsigned n) {
data->resize();
}
//...
};
template
void Array_data::resize(unsigned n)
{
if(n == sz) return;
T* odata = data;
data = new T[n];
copy(odata, sz >n?n:sz); //没有想明白?
delete [] odata;
sz = n;
}
template
void Array_data::copy(T* arr, unsigned n)
{
for (int i = 0; i < n; i++)
data[i] = arr[i];
}
Array a;
//...
while( /*某个条件*/ )
{
a.reserve(n+1);
a[n] = //某个值
}
//用户很可能写这样的代码
a.reserve(n);
a[n] = //某个值
template class Array {
public:
void reserve(unsigned new_sz) {
if(new_sz >= data->sz)
data->grow(new_sz);
}
//....
};
template
void Array_data::grow(unsigned now_gz)
{
unsigned nsz = sz;
if(nsz == 0)
nsz = 1;
while(nsz <= new_sz)
nsz *= 2;
resize(nsz);
}
要想能够有效的重新设置Array的大小,需要还能对它进行复制和赋值。
template class Array {
public:
Array(const Array& a):
data(new Array_data(a.data->sz)
{
data->copy(a.data->data, a.data->sz);
}
Array& operator=(const Array&); ///???
//...
};
我们不希望允许对Array_data对象赋值。将不能正确地管理引用计数。我们将在Array_data中定义一个clone操作来重新分配data数组和进行复制操作。要记住检查自我复制。(?)
template class Array{
public:
Array& operator=(const Array& a) {
if(this != &a)
data->colone(*a.data, a.data->data);
return *this;
}
//...
};
template
void Array_data::clone(const Array_data& a, unsigned n)
{
delete [] data;
data = new T[sz= a.sz];
copy(a.data, sz);
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/409557/viewspace-893681/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/409557/viewspace-893681/