C++プログラミング思想第三章例コード(二)友元


友元(この構造に属さないメンバーが構造内のデータにアクセスできるようにする)
原文のコードではキーワードfriendで外部関数,外部構造,外部構造の関数をXの友元として宣言し,Xのprivate変数へのアクセスを許可する.
注目すべきは、元の構造Aのネスト構造Bの関数は上位構造Aのprivate変数を呼び出すことができず、Bの関数がAの友元であることを宣言してBのprivate変数を呼び出すことができ、ネスト友元と呼ばれる.
//:FRIEND.CPP--Friend allows special access
struct X;
struct Y{
	void f(X*);
};

struct X{
private:
		int i;
public:
		void initialize();
		friend void g(X*,int);//global friend
		friend void Y::f(X*);//struct member friend
		friend struct Z;//Entire struct is a friend
		friend void h();
};

void X::initialize(){
	i=0;
}

void g(X* x,int i){
	x->i=i;
}

void Y::f(X* x){
	x->i=47;
}

struct Z{
	private:
		int j;
	public:
		void initialize();
		void g(X* x);
};
void Z::initialize(){
	j=99;
}

void Z::g(X* x){
	x->i+=j;
}

void h(){
	X x;
	x.i=100;
}

main(){
	X x;
	Z z;
	z.g(&x);
	
}