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