C++嵌套类

http://hi.baidu.com/zhanglp/item/9361ea0d4dab1b19addc7096

C++嵌套类

1、 嵌套类的名字只在外围类可见。


2、 在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。

   虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。 它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类 。嵌套类的出现只是 告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的访问也同样如此,它们都遵循普通类所具 有的标号访问控制。    若不在嵌套类内部定义其成员,则其定义只能写到与外围类相同的作用域中,且要用外围类进行限定,不能把定义写在外围类中。例如,嵌套类的静态成员就是这样的一个例子。    前面说过,之所以使用嵌套类的另一个原因是达到底层实现隐藏的目的。为了实现这种目的,我们需要在另一个头文件中定义该嵌套类,而只在外围类中前向声明这 个嵌套类即可。当然,在外围类外面定义这个嵌套类时,应该使用外围类进行限定。使用时,只需要在外围类的实现文件中包含这个头文件即可。    另外,嵌套类可以直接引用外围类的静态成员、类型名和枚举成员,即使这些是private的。

一个好的嵌套类设计:嵌套类应该设成私有。嵌套类的成员和方法可以设为 public 。


4、 嵌套类可以直接访问外围类的静态成员、类型名( typedef )、枚举值。


5、 嵌套类定义的名字解析过程:

出现在名字使用点前的嵌套类的声明。

出现在名字使用点前外围类的声明。

嵌套类定义前名字空间域的声明。

6、 嵌套类的成员定义中的名字解析过程:

成员函数局部声明。

嵌套类成员的声明。

外围类成员的声明。

成员函数定义前名字空间域中出现的声明。

class Outter 

// friend class Inner 加了这行也白搭 
protected: 
void Foo(){}; 
private: 
void Foo2(){}; 
public: 
void Foo3(){}; 

private: 
class Inner 

Inner(Outter *pFather) 

pFather->Foo(); // Error, compiler complain !! 
pFather->Foo2(); //Error, compiler complain !! 
pFather->Foo3(); //OK ! 


}; 

};

嵌套的结构(当然包括类)并不能自动获得访问private成员的权限,要获得的。。的话,必须遵守特定的规则:首先声明(不是定义)一个嵌套结构,然后 声明它是全局范围使用的一个friend,最后定义这个结构。结构的定义必须与friend声明分开,否则不会把它看做成员。

改成这样,就可以通过编译了 
class Outter 

protected: 
void Foo(){}; 
private: 
void Foo2(){}; 
public: 
void Foo3(){}; 
private: 
class Inner;//声明 
friend Inner;//声明为友元 
class Inner 

Inner(Outter *pFather) 

pFather->Foo(); 
pFather->Foo2(); 
pFather->Foo3(); 

}; 
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值