/**
* 功能:嵌套友元
* 时间: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、嵌套友元
最新推荐文章于 2018-07-20 21:24:02 发布