Smart pointer (operator overload)


class obj
{
public:
    void f()
    {
        cout<<i++<<endl;
    }

    void g()
    {
        cout<<j++<<endl;
    }

private:
    static int i, j;
};

int obj::i = 47;
int obj::j = 11;

//container
class obj_container
{
    enum
    {
        sz = 100
    };

    obj* a[sz];
    int index;

public:
    obj_container()
    {
        index = 0;
        memset(a, 0, sz*sizeof(obj*));
    }

    void add(obj* OBJ)
    {
        if (index>=sz)
        {
            return;
        }

        a[index++] = OBJ;
    }

    friend class sp;
};

//Iterator:
class sp
{
    obj_container* oc;
    int index;

public:
    sp(obj_container* OC)
    {
        index = 0;
        oc = OC;
    }

    //Return value indicates end of list:
    int operator++()//Prefix
    {
        if (index >= oc->sz) return 0;

        if (oc->a[++index] == 0) return 0;

        return 1;
    }

    int operator++(int) //Postfix
    {
        return operator++();
    }

    obj* operator->() const
    {
        if(oc->a[index]) return oc->a[index];

        static obj dummy;
        return &dummy;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    const int sz = 10;
    obj o[sz];
    obj_container OC;

    for (int i=0; i<sz; i++)
    {
        OC.add(&o[i]);  //Fill it up
    }

    sp SP(&OC); //Create an iterator
    do
    {
        SP->f();    //smart pointer calls
        SP->g();
    } while (SP++);
}

posted @ 2012-09-24 17:45  xmli  阅读(99)  评论(0)    收藏  举报