在《c++编程思想》中,第五章,第三节中有一个嵌套友元。有一个句话是“嵌套结构并不能自动获得访问private成员的权限”代码如下图
即被嵌套进Holder结构的Pointer不能自动获得访问Holder私有成员a[sz]的权限,必须把Pointer声明为Holder的友元结构才行。对此做如下实验:
//test.h 文件 #ifndef TEST_H #define TEST_H class OuterClass{ private: int m_i; public: class InnerClass{ public: void printOuter(OuterClass vo); void setOuter(OuterClass* ot,int i); }; OuterClass(int i); }; #endif TEST_H
//test.cpp文件 #include"test.h" #include<iostream> using namespace std; OuterClass::OuterClass(int i):m_i(i){ } void OuterClass::InnerClass::printOuter(OuterClass ot){ cout << ot.m_i << endl; } void OuterClass::InnerClass::setOuter(OuterClass* ot, int i){ ot->m_i = i; }
//demo.cpp文件 #include"test.h" #include<iostream> using namespace std; int main(){ OuterClass ot(0); OuterClass::InnerClass inn; inn.printOuter(ot); inn.setOuter(&ot,100); inn.printOuter(ot); return 0; }
上述代码就是没有把内部的InnerClass 声明为OuterClass的友元结构的实验,实验证明上述代码可以编译通过,也可以正确运行,运行结果如下
其实把书中代码注释掉一行也可以说明问题,
把friend struct Pointer注释掉,不声明Pointer是Holder的友元结构,Pointer里面的函数仍然可以访问a[sz].