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

“全局对象会破坏封装:对象需要支持特定类抽象的实现”?哪位高手给个代码例子帮助理解下

2012-05-28 
“全局对象会破坏封装:对象需要支持特定类抽象的实现”?谁给个代码例子帮助理解下《C++ Primer》中文第四版398

“全局对象会破坏封装:对象需要支持特定类抽象的实现”?谁给个代码例子帮助理解下
《C++ Primer》中文第四版398页——12.6 static类成员,开头提到“对于特定类类型的全体对象而言,访问一个全局对象有时是必要的”,也讲到“全局对象会破坏封装:对象需要支持特定类抽象的实现”,后面又讲到使用类的static成员而不是全局对象有三个优点。 经过阅读这节,这个static类成员是啥我理解了,但“全局对象”在书这里又是什么意思?还有就是“全局对象会破坏封装:对象需要支持特定类抽象的实现”这句话该怎么理解,咋破坏封装性了? 谁来给个简单的代码例子来解释下(用全局对象,不是用static类成员)。

[解决办法]
>>开头提到“对于特定类类型的全体对象而言,访问一个全局对象有时是必要的”
这里的必要,应该是说,在某些情况下,使用全局对象可以完成一个功能。

>>经过阅读这节,这个static类成员是啥我理解了,但“全局对象”在书这里又是什么意思?
定义在全局域中的对象。

>>还有就是“全局对象会破坏封装:对象需要支持特定类抽象的实现”这句话该怎么理解,咋破坏封装性了? 
全局对象可以用来保存一个状态。例如,记录类型T产生的实例个数,这个可以用全局int对象来充当计数器,在构造T对象的时候,这个计数器自增,析构的时候自减。这看起来似乎很合理,但是这个全局对象可以被任何代码访问并修改,可以不受限制地给这个计数器设置成-100,这样就破坏掉计数器原本的规则。既然计数器和类型T相关,就应该让这两个结合起来,把这个计数器设置成T的私有static成员。否则就破坏了封装,把应该隐藏的部分,暴露了出来。

C/C++ code
//不考虑线程安全class T{public:    T()    {        ++n;    }    T(const T&)    {        ++n;    }    ~T()    {        --n;    }    static int number()    {        return n;    }private:    static int n;};int T::n;
[解决办法]
全局对象指全局命名空间作用域声明的对象。和类作用域声明的静态对象相比,它无法受到访问权限控制,因此类的静态成员对象可以有更好的封装性。如果类的静态成员对象是public,那么也就是声明位置的区别(全局对象声明的位置更自由,可以脱离类的定义而不在同一个文件,修改起来也可能更麻烦点)。

[解决办法]
那代码就是想表达用static解决全局对象破坏封装的意思.
你贴的代码也正是那意思。因为擅自修改n而破坏类型T维护的n的规则,这就是破坏了基本的 不变式 的原则。

热点排行