overloading operator->

N

Nico

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,770
Messages
2,569,583
Members
45,074
Latest member
StanleyFra

Latest Threads

Top