首页 > 代码库 > 【ThinkingInC++】60、嵌入的迭代器

【ThinkingInC++】60、嵌入的迭代器

嵌入的迭代器

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;

}


 

【ThinkingInC++】60、嵌入的迭代器