首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++沉思录 13章的有关问题(作者并没有解决暴露类内部的实现机制?)

2013-01-01 
C++沉思录 13章的问题(作者并没有解决暴露类内部的实现机制?)本帖最后由 mmhaojie 于 2012-12-12 11:30:42

C++沉思录 13章的问题(作者并没有解决暴露类内部的实现机制?)
本帖最后由 mmhaojie 于 2012-12-12 11:30:42 编辑 用户能够轻易的获得指向Vector内部的指针,这种关系暴露了类内部的实现机制?

 T& operator[](unsigned n) const             //读
              {
                     if(n >= sz || data == 0)
                            throw "Vector subscript out of range";
                     return data[n];
              }
//改为

 T operator[](unsigned n) const             //讀
              {
                     if(n >= sz || data == 0)
                            throw "Vector subscript out of range";
                     return data[n];
              }
//用update 函数来修改Array中的元素


可以理解,作者是为了禁止T* t=&*p(也就是防止暴露类内部的实现机制,不是很理解)  其中p的定义为Point<T> p

最重要的一点:
13章并没有解决他所说的暴露类内部的实现机制问题!如最后 的实现是这样的:

  Pointer& operator=(const Pointer<T> &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 Pointer";


                     return (*ap)[sub];
              }



并没发现该问题已经解决,各位大神是怎么理解的?麻烦给出详细理解过程。
[解决办法]
T operator[]  改成这样的, 要对元素赋值就变得麻烦, 并且跟常用的数组行为方式不同, 很容易被误用了.
比如用户调用 data[n] = 3;  实际根据没有改变原数组中的任何东西, 只改变了临时对象. 这就会让用户程序发生难以查找的错误.
[解决办法]
>>例子代码网上一堆,放上来问题就变得复杂了,看过c++沉思录没?
没有。听说过,在好多地方也看到过这个名字。

就像你说的这里没有禁止。不过我想,Pointer 那边一定不能禁止,因为要实现指针语意,所以必须要求 Vector_data::operator[] 返回 T&;至于 Vector 那边,倒是可以通过返回值类型禁止取地址,不过这样又引入了重类型复制的问题,权衡利弊之下,还是效率更重要一些吧。

我觉得这是设计抉择,返回引用的设计,至少还可以依赖客户端自律不取内部成员地址(当然这个没有编译器强制保险),如果需要编译器检查的话,客户端还可以通过 const 对象保证不能取地址;但如果返回值类型,对于体积大的 T,那任何访问操作都会变慢,而且没有其他方法可以绕开,因此不管你愿不愿意,不管你是否自律,都要付出不必要的代价,这实在不是什么好主意。
[解决办法]
作者有说啊,这种"解决"方式有限制.权衡以后,为了方便性,舍去了安全性.
因为Pointer类的目的是为了让用户不必直接使用原始的指针.从而有更多的自动机制.比如:数据保持.而这是用原始指针达不到的.

热点排行