NestedSmartPointer.cpp
/**
* 书本:【ThinkingInC++】
* 功能:嵌入的迭代器
* 时间:2014年9月26日10:03:03
* 作者:cutter_point
*/
#include<iostream>
#include<vector>
#include"../require.h"
usingnamespace std;
class Obj
{
static int i, j; //静态变量
public:
void f() {cout<<i++<<endl;}
void g() {cout<<j++<<endl;}
};
int Obj::i=47;
intObj::j=11;
classObjContainer
{
vector<Obj*> a; //这是一个存放Obj类的容器
public:
void add(Obj* obj) {a.push_back(obj);}
class SmartPointer; //声明一个类,为了下面写是友元
friend SmartPointer; //声明是友元的前提是必须知道类是存在的
class SmartPointer
{
ObjContainer& oc;
unsigned int index;
public:
SmartPointer(ObjContainer& objc) :oc(objc) {index=0;}
bool operator++() //前缀++
{
if(index >= oc.a.size()) returnfalse;
if(oc.a[++index] == 0) returnfalse; //这是为了判断能否++,实际上还把++操作已经执行了
//index的数据值已经改变了
return true;
}
bool operator++(int)
{
return operator++(); //这个后缀++的结果和前缀是一样的
}
Obj* operator->() const //重头戏,这个->是这节要学习的关键,运算符重载
{
require(oc.a[index] != 0,"Zero value returned by SmartPointer::operator->()");
return oc.a[index]; //返回数组的第index个数据
}
};
//这里有一个函数,就像C++标准库使用的部分形式,为了回到index为0的地方
SmartPointer begin() {returnSmartPointer(*this);}
};
int main()
{
const int sz=10;
Obj o[sz];
ObjContainer oc;
for(int i=0 ; i<sz ; ++i)
oc.add(&o[i]);
ObjContainer::SmartPointer sp=oc.begin();
do
{
sp->f();
sp->g();
}while(++sp);
return 0;
}
原文地址:http://blog.csdn.net/cutter_point/article/details/39576683