It will be easier to see by pulling hophop
out of the datas
class. Now you can see the hophop
constructor and what it is up to. I would have removed the return value of the ++operator
, set it to void, to point out it does nothing here.
#include <iostream>
class hophop {
private:
const char* pos, next;
public:
hophop(const char* p, char m) : pos(p), next(m) {}
char operator *() { return *pos; }
hophop operator ++() {
++pos;
while (*(pos + 1) != next)
++pos;
return *this;
}
bool operator !=(const hophop& o) { return pos < o.pos; }
};
class datas {
private:
using iterator = hophop;
const char* string, marker;
const int len;
public:
datas(const char* d, int l, char m) : string(d), len(l), marker(m) {}
iterator begin() { return hophop(string, marker); }
iterator end() { return hophop(string + len, marker); }
};
int main(void) {
datas chars("we are where we were", 20, 'e');
// w r h r w w r
for (char c : chars)
std::cout << c;
std::cout << "\nusing a non range based for loop:" << std::endl;
for (hophop it = chars.begin(); it != chars.end(); ++it)
std::cout << *it;
std::cout << "\nor where the return value could be used:" << std::endl;
auto it = chars.begin();
std::cout << *it;
for (; it != chars.end();)
std::cout << *++it;
}
So now it may be easier to see how the hophop ++ operator is working. operator *()
gets called at the beginning of the loop so no matter what the first character is, it gets retrieved. Then the ++operator
is called and it moves the iterator at least once forward and until it matches next
. Then it returns the character before the match. Look at the comment in main. The first and every character before the e
is returned.
If you have not used a debugger much, you should. by putting a break point in operator++
you can see what is happening.
UPDATE
I had previously set the return value of the ++operator
to void. As @JaMiT points out, it is appropriate for the operator to return *this
. I've also added two more loops, they should be clearer than using a range based loop. The third example actually uses the return value of the ++operator
, the first two loops don't.
And, get in the habit of not using namespace std;
It will save you from troubles down the road.