码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-09-26 12:05:01      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:thinkinginc++   嵌入的迭代器   运算符重载   

嵌入的迭代器

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、嵌入的迭代器

标签:thinkinginc++   嵌入的迭代器   运算符重载   

原文地址:http://blog.csdn.net/cutter_point/article/details/39576683

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!