/** * 功能:嵌套友元 * 时间:2014年8月21日07:21:29 * 作者:cutter_point */ #include<iostream> #include<cstring> //为了初始化时使用memset() #include<cstdlib> using namespace std; const int sz=20; struct Holder { private: int a[sz]; //一个整形数组 public: void initialize(); //初始化函数,初始化Holder struct Pointer; //声明有这个结构体 friend Pointer; //声明友元 struct Pointer { private: Holder* h; int* p; public: void initialize(Holder* h); //这个是Pointer的初始化 void next(); //下一个元素 void previous(); //上一个元素 void top(); // 得到起始下标为0的位置 void end(); //得到起始下标为最后一个的位置 int read(); //返回当前位置的值 void set(int i); //吧当前位置的值设置为i }; }; /* 使用C语言库函数memset()(在<cstring>中)可以使用上面的程序变得容易。 他吧起始于某一特定地址的内存(该内存作为第一个参数)从起始地址直至 其后的n(n作为第三个参数)个字节的所有内存都设置成同一个特定的值(该值作为第 二个参数)。 */ // void initialize(); //初始化函数,初始化Holder void Holder::initialize() { //int a[sz]; //一个整形数组 memset(a, 0, sz*sizeof(int)); } // void initialize(Holder* h); //这个是Pointer的初始化 void Holder::Pointer::initialize(Holder* rv) //取得是指针,可以直接改变原值 { /* Holder* h; int* p; */ h=rv; p=rv->a; } // void next(); //下一个元素 void Holder::Pointer::next() { if(p<&(h->a[sz-1])) ++p; } // void previous(); //上一个元素 void Holder::Pointer::previous() { if(p>&(h->a[0])) --p; } // void top(); // 得到起始下标为0的位置 void Holder::Pointer::top() { p=&(h->a[0]); } //void end(); //得到起始下标为最后一个的位置 void Holder::Pointer::end() { p=&(h->a[sz-1]); } //int read(); //返回当前位置的值 int Holder::Pointer::read() { return *p; } //void set(int i); //吧当前位置的值设置为i void Holder::Pointer::set(int i) { *p=i; } int main() { Holder h; Holder::Pointer hp, hp2; int i; h.initialize(); hp.initialize(&h); hp2.initialize(&h); for(i=0 ; i<sz ; ++i) { hp.set(i); hp.next(); } hp.top(); //这个数组的头 hp2.end(); //这个数组的尾 for(i=0 ; i<sz ; ++i) { cout<<"hp= "<<hp.read() <<", hp2= "<<hp2.read()<<endl; hp.next(); hp2.previous(); } system("pause"); return 0; }
【ThinkingInC++】31、嵌套友元,布布扣,bubuko.com
原文:http://blog.csdn.net/cutter_point/article/details/38724353