读书笔记: 访问容器中的元素2

C++沉思录第十三章读书笔记2

[@more@]

template class Array {

public:

Array():data(0), sz(0) {}

Array(unsigned size):

sz(size), data(new T[size]) {}

~Array() { delete [] data; }

const T& operator[ ](unsigned n) const

{

if(n >= sz || data ==0)

throw "Array subscript out of range";

return data[n];

}

T& operator[] (unsigned n)

{

if(n >= sz || data == 0)

throw "Array subscript out of range ";

return data[n];

}

operator const T*() const

{

return data;

}

operator T*()

{

return data;

}

private:

T* data;

unsigned sz;

Array(const Array& a);

Array& operator=(const Array&);

};

template class Pointer {

public:

Pointer(Array& a, unsigned n = 0):

ap(&a), sub(n) {};

Pointer(): ap(0), sub(0) {};

T& operator* () const { //&和不//加的区别,还是

//要自己调程序

if(ap == 0)

throw "*of unbound Pointer";

return (*ap) [sub];

}

private:

Array* ap;

unsigned sub;

};

int main()

{

/*

Array* ap = new Array (10);

Pointer p(*ap, 5);

Delete ap;

*p=t2;

*/

Array x(20);

int a[5];

Pointer p(x,20);

*p =5; //终于明白为什么要返回要加&,加的话就可以修改,不然只是返

///回一个临时值。

//*(p+1) =1; 有错误!

int t = *p;

cout << t<

}

13-3遗留问题

到目前为止,只设法增加了一个防止出错的中间层。现在如果Array不存在了,还可能存在一个指向它的某个元素的空悬Pointer.

通过引进一个额外的中间层,我们能够解决任何问题。如果想要删除了Array对象后仍然保留数据,就可以运用这个定理,既让Array指向数据而不是包含数据。

现在每个Pointer对象都指向一个Array_data对象,而不是一个Array对象。每个Array_data对象都会包含一个引用计数。

因为这个类不是直接提供用户使用的,所以成员都是私有的。

template class Array_data {

friend class Array< T >;

friend class Pointer;

Array_data(unsigned size = 0):

data(new T[size]), sz(size), use(1) {}

~Array_data() { delete [] data; }

const T& operator[] (unsigned n) const

{

if(n>=sz)

throw "Array subscript out of range";

return data[n];

}

T& operatir[](unsigned n)

{

if(n>= sz)

throw "Array subscript out of range";

return data[n];

}

//没有实现,不允许复制操作。

Array_data(const Array_data&);

Array_data& operator=(const Array_data&);

T*data;

unsigned sz;

int use;

};

template class Array {

friend class Pointer;

public:

Array(unsigned size):

data(new Array_data(size)) {}

~Array() {

if(--data->use == 0)

delete data;

}

const T& operator[] (unsigned n) const {

return (*data)[n];

}

T& operator[](unsigned n) {

return (*data)[n];

}

private:

Array(const Array&);

Array& operator =(const Array&);

Array_data* data;

};

template clss Pointer:public Ptr_to_const {

public:

Pointer(Array& a, unsigned n = 0):

Ptr_to_const (a,n) {}

Pointer():ap(0), sub(0) {}

Pointer(const Pointer& p):ap(p.ap), sub(p.sub) {

if(ap)

++ap->use;

}

Pointer& operator=(const Pointer& p) {

if(p.ap)

++p.ap->use;

if(ap && --ap->use == 0)

delete ap;

ap = p.ap;

sub = p.sub;

return *this;

}

T& operator*() const {

if(ap == 0)

throw "*of unbound Ptr_to_const";

return (*ap)[sub];

}

private:

Array_data* ap;

unsigned sub;

};

这部分没有调试出来,不知道错误在哪里?

为什么操作符[]不能用呢?

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/409557/viewspace-893577/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/409557/viewspace-893577/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值