在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。
嵌套类的作用就是一句话,“之所以引入这样一个嵌套类,往往是因为
外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。“
代码说事,如果我们把类中的成员作用域分 public protect private ,当定义成private 时,顾名思义这是私有成员如下:
-
class Cxx
-
{
-
-
-
...
-
private:
-
int a;
-
int b;
-
-
}
a,b 只有类Cxx内部才可以访问,这是无疑的。
那要某些方法只允许在某一个成员函数里调用,就是说作用域只限于这个成员函数中, 比如:
-
class Cxx
-
{
-
public:
-
-
void DoSomething()
-
{
-
// 隐藏这部分的实现
-
-
}
-
-
}
有办法吗? 嵌套类该用上排场了。
-
class Cxx
-
{
-
public:
-
-
void DoSomething()
-
{
-
class Cyy //<--嵌套类
-
{
-
//.....
-
};
-
-
-
Cyy y ;
-
-
//do something with y object
-
-
}
-
-
}
这样Cyy 和y等都隐藏在DoSomething() 中,Cxx内部也访问不了。
光说上面印象不够深刻,结合实际生产,也许会加深印象。说下levelDB 代码中的嵌套类用法,levelDB 是google 两位大牛写的,代码很漂亮,C++ 代码。
-
class WriteFile
-
{
-
-
//....
-
-
void write(int _k,int _v)
-
{
-
-
class Hander
-
{
-
-
void put(int k,int v)
-
{
-
(*map)[k]->insert(v) //insert to map
-
}
-
-
KVMap* map;
-
}
-
-
Hander hander;
-
hander->map = &_map;
-
hander->put(_k,_v);
-
}
-
-
KVMap _map;
-
}
外围类的成员 _map 的插入(实现)就隐藏在了内部类Hander 中,对外暴露只是write 。
关于嵌套类上面代码足以说明问题,但是为了说明嵌套类,LevelDB 中的代码是被我剥离出来,还做了些修改,Google Jeff Dean, Sanjay Ghemawat 两位大牛,肯定不会局限这个层面。
既然看了代码,就不能轻易放过,看看这段代码真面目。
待续。。。
阅读(1476) | 评论(0) | 转发(0) |