Chinaunix首页 | 论坛 | 博客
  • 博客访问: 291423
  • 博文数量: 63
  • 博客积分: 814
  • 博客等级: 军士长
  • 技术积分: 700
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 15:46
文章分类

全部博文(63)

文章存档

2017年(1)

2016年(4)

2015年(13)

2014年(9)

2012年(3)

2011年(33)

分类: C/C++

2015-11-13 18:47:23


在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。

嵌套类的作用就是一句话,“之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。“

代码说事,如果我们把类中的成员作用域分 public protect private ,当定义成private 时,顾名思义这是私有成员如下:


点击(此处)折叠或打开

  1. class Cxx
  2. {


  3. ...
  4. private:
  5.     int a;
  6.     int b;

  7. }
a,b 只有类Cxx内部才可以访问,这是无疑的。

那要某些方法只允许在某一个成员函数里调用,就是说作用域只限于这个成员函数中, 比如:

点击(此处)折叠或打开

  1. class Cxx
  2. {
  3. public:

  4. void DoSomething()
  5. {
  6. // 隐藏这部分的实现

  7. }

  8. }
有办法吗?   嵌套类该用上排场了。

点击(此处)折叠或打开

  1. class Cxx
  2. {
  3. public:

  4. void DoSomething()
  5. {
  6. class Cyy  //<--嵌套类
  7. {
  8. //.....
  9. };


  10. Cyy y ;

  11. //do something with y object

  12. }

  13. }
这样Cyy 和y等都隐藏在DoSomething() 中,Cxx内部也访问不了。

光说上面印象不够深刻,结合实际生产,也许会加深印象。说下levelDB 代码中的嵌套类用法,levelDB 是google 两位大牛写的,代码很漂亮,C++ 代码。

点击(此处)折叠或打开

  1. class WriteFile
  2. {

  3. //....

  4. void write(int _k,int _v)
  5. {

  6.    class Hander
  7.    {

  8.       void put(int k,int v)
  9.       {
  10.          (*map)[k]->insert(v) //insert to map
  11.       }

  12.       KVMap* map;
  13.     }

  14.     Hander hander;
  15.     hander->map = &_map;
  16.     hander->put(_k,_v);
  17. }

  18. KVMap _map;
  19. }
外围类的成员 _map 的插入(实现)就隐藏在了内部类Hander 中,对外暴露只是write 。

关于嵌套类上面代码足以说明问题,但是为了说明嵌套类,LevelDB 中的代码是被我剥离出来,还做了些修改,Google Jeff Dean, Sanjay Ghemawat 两位大牛,肯定不会局限这个层面。
既然看了代码,就不能轻易放过,看看这段代码真面目。

待续。。。






阅读(1422) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~