Egzamin i przeciążanie

0

Witam, mam jutro egz z c++ i muszę przeciążyć operator ++ do zadania. Mianowicie mam listę obiektów miast, klasę iterator i chcę aby operator ++ przechodził po miastach w liście. Mianowicie coś takiego

Iterator it;
it++;

napisałem tak, ale wywala błąd że "postfix 'void... must take 'int' as its argument'. Jaki int?!

#include <iostream>
#include <list>
#include <string>

using namespace std;

class Miasto
{
	public:
	string name;
	int population;
};


class Iterator
{
	protected:
	int bylo;
	
    public:
	list<Miasto> lista;
	Miasto aktualne;
	
	Iterator(const list<Miasto>& lista);
	operator bool()const;
	void operator++(Iterator iter);
	Miasto * get();
};

Iterator::Iterator(const list<Miasto>& lista)
{
	this->lista = lista;
	this->bylo = 0;
	aktualne = this->lista.front();
}

void Iterator::operator++(Iterator iter)
{
	int k = 0;
	list<Miasto>::iterator it;
	for(it = this->lista.begin(); it != this->lista.end(); it++)
	{
		if(k == this->bylo+1)
		{
			this->aktualne = *it;	
		}
		k++;
	}
}

Miasto * Iterator::get()
{
	return &aktualne;
}

int main()
{
	Miasto a;
	Miasto b;
	Miasto c;
	a.name = "ZMC"; b.name = "TL"; c.name = "Krk";
	
	list<Miasto>lista;
	lista.push_back(a); lista.push_back(b); lista.push_back(c);
	
	Iterator it(lista);
	++it;
	
	return 0;
}
1

Skoro operator ++ jest funkcją składową, to dlaczego miałby mieć jakikolwiek argument? Przecież on operuje na tym obiekcie. Jednak trzeba jakoś rozróżnić operator pre i post dekrementacji. Do tego rozróżnienia stosuje się właśnie niepotrzebny argument o typie int. Dlatego Twoj operator będzie wyglądał tak:

Iterator Iterator::operator++(int)

A nie tak:

void Iterator::operator++(Iterator iter)

Natomiast niżej w kodzie użyłeś operatora preinkrementacji, ten nie ma żadnego argumentu, jeżeli jest funkcją składową.

Pamiętaj o tym, że operatory te zachowują się inaczej, jeżeli chodzi o wartość zwracaną. Ten Twój niczego nie zwracał i owszem, może tak być, ale chyba jednak powinien.

1

A jak chciałbyś odróżnić ++i od i++? Oba to przecież funkcja operator++()! Dlatego zrobiono małego hacka w c++ i jeden operator to operator++() a drugi to operator++(int)

0

Faktycznie nie pomyślałem o tym ;] Nigdzie nic o tym int nie było, dlatego tak się zastanawiałem o co caman. Dzięki wam!

1 użytkowników online, w tym zalogowanych: 0, gości: 1