Thinking in C++读书笔记--3.3友元

//一个嵌套的struct不能自动的获得存取私有成员的权限
//必须遵循特定的规则:首先声明一个嵌套的struct,然后声明它是全局范围使用的一个友元
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#define SZ 20
struct holder {
private:
 int a[SZ];
public:
 void initialize();
 struct pointer {//内嵌的struct
 private:
  holder* h;
  int* p;
 public:
  void initialize( holder* H );
  void next();
  void previous();
  void top();
  void end();
  int read();
  void set( int i );
 };
 friend holder::pointer;//内嵌的struct声明与friend的声明分开,否则编译器不把它当作成员
};

void holder::initialize() {
 memset(a, 0, SZ * sizeof(int));
}

void holder::pointer::initialize(holder* H) {
 h = H;
 p = h->a;
}

void holder::pointer::next() {
 if ( p < &(h->a[SZ-1]) )
  p++;
}

void holder::pointer::previous() {
 if ( p > &(h->a[0]) )
  p--;
}

void holder::pointer::top() {
 p = &(h->a[0]);
}

void holder::pointer::end() {
 p = &(h->a[SZ-1]);
}

int holder::pointer::read() {
 return *p;
}

void holder::pointer::set( int i ) {
 *p = i;
}

int _tmain( int argc , _TCHAR* argv[] )
{
 holder h;
 holder::pointer hp1, hp2;
 int i;
 h.initialize();
 hp1.initialize(&h);
 hp2.initialize(&h);
 for ( i = 0; i < SZ ; i++ ) {
  hp1.set(i);
  hp1.next();
 }
 hp1.top();
 hp2.end();
 for ( i = 0; i < SZ ; i++ ) {
  printf("hp1 = %d, hp2 = %d/n", hp1.read(), hp2.read());
  hp1.next();
  hp2.previous();
 }
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值