overloading operator->

Discussion in 'C++' started by Nico, Sep 6, 2007.

  1. Nico

    Nico Guest

    I want to create a const_iterator that gives me access to dynamically
    generated objects.
    For example see the class Polygon that contains a list of points
    stored as following doubles in a vector (x1, y1, x2, y2, ...). The
    iterator should return only pairs of doubles to avoid possible
    confusion of the user of the class Polygon. (The storage format is
    needed for conversion to other libraries.)
    The code for Polygon below compiles well, but the problem is using the
    operator->.

    inline pair<double,double> operator->() { return pair<double,
    double>(*_points, *(_points+1)); }

    If I use the -> operator like this:
    Polygon p;
    p.addPoint(5.0, 5.0);
    for(Polygon::iterator it = polygon.begin(); it != polygon.end(); +
    +it) {
    cout << it->first << endl;
    cout << (it).second << endl;
    }

    I get the following compile error: result of 'operator->()' yields non-
    pointer result
    The second line with the * operator gives no errors.

    Is it possible to overload the operator-> in the intended way?

    #include <utility>
    #include <vector>
    using namespace std;
    class Polygon{
    public:
    class iterator;
    inline Polygon() : _points() {};
    inline Polygon(unsigned size) : _points(size*2) {};
    virtual ~Polygon() {};
    inline void addPoint(double x, double y)
    {
    _points.push_back(x);
    _points.push_back(y);
    }
    inline Polygon::iterator begin() const { return
    iterator(*this, 0); }
    inline Polygon::iterator end() const { return
    Polygon::iterator(*this, _points.size()); }
    inline void clear() { _points.clear(); }
    inline void resize(unsigned i)
    { _points.resize(i*2); }
    inline unsigned size() const { return _points.size()/
    2; }
    inline const double* data() const { return
    &_points[0]; }

    class iterator : public
    std::iterator<std::random_access_iterator_tag, pair<double, double> >
    {
    private:
    const Polygon* _polygon;
    unsigned _offset;
    vector<double>::const_iterator _points;
    public:
    inline iterator(const Polygon& p, unsigned offset = 0) :
    _polygon(&p), _offset(offset), _points(p._points.begin())
    { }
    inline iterator(const iterator& i) :
    _polygon(i._polygon), _offset(i._offset),
    _points(i._points)
    { }
    inline pair<double, double> operator*() const
    { return pair<double, double>(*_points, *(_points
    +1)); }
    inline pair<double, double> operator[](unsigned i) const
    { return pair<double, double>(*(_points+(i*2)),
    *(_points+(i*2)+1)); }

    inline pair<double,double> operator->() { return pair<double,
    double>(*_points, *(_points+1)); }
    inline iterator& operator++()
    {
    ++_points;
    ++_points;
    ++_offset;
    return *this;
    }
    inline iterator operator++(int)
    {
    iterator p = *this;
    ++(*this);
    return p;
    }
    inline iterator& operator=(iterator& i)
    {
    if (this == &i) { // Same object?
    return *this;
    }
    _polygon = i._polygon;
    _offset = i._offset;
    _points = i._points;
    return *this;
    }
    inline bool operator==(const iterator& i) const
    {return _polygon == i._polygon && _offset == i._offset;}
    inline bool operator<(const iterator& i) const
    { return _polygon < i._polygon || (_polygon ==
    i._polygon && _offset < i._offset); }
    inline bool operator!=(const iterator& i) const { return !
    (*this == i); }
    inline bool operator>(const iterator& i) const { return i
    < *this; }
    inline bool operator<=(const iterator& i) const { return !
    (i < *this); }
    inline bool operator>=(const iterator& i) const { return !(*this <
    i); }
    };
    private:
    vector<double> _points;
    };

    #endif
    Nico, Sep 6, 2007
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. John Smith
    Replies:
    2
    Views:
    410
    Ivan Vecerina
    Oct 6, 2004
  2. Replies:
    11
    Views:
    716
    James Kanze
    May 16, 2007
  3. hurcan solter
    Replies:
    3
    Views:
    712
    Cholo Lennon
    Aug 29, 2007
  4. Replies:
    11
    Views:
    544
  5. Replies:
    2
    Views:
    300
Loading...

Share This Page