• 嵌套结构可以访问外部结构的私有成员吗?


    在《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].

  • 相关阅读:
    Bufferedreader和BufferedWriter(带缓存的输入输出)
    FileReader和FileWriter
    Map接口的类实现
    Map接口
    Set集合
    List接口的实现类
    获取文本框或密码框中的内容
    ADTS (zz)
    初级美语 L003:My Family 解析
    初级美语 L001:Self Introduction 解析
  • 原文地址:https://www.cnblogs.com/cplinux/p/5544059.html
Copyright © 2020-2023  润新知