首页 > 代码库 > 【ThinkingInC++】31、嵌套友元

【ThinkingInC++】31、嵌套友元

/**
* 功能:嵌套友元
* 时间: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;
}