[C++] przeładowanie operatorów

Witam.

Przeładowałem operator++ w taki sposób:

void klasa::operator++()

{	

	this->numer = jakas_zmienna + 1;

}

Jedyny sposób, w który mogę go uruchomić, to tak:

// w pewnej funkcji zaprzyjaźnionej z klasą

tablica_wskaznikow[size]->operator++();

Ale nie o to chodzi w przeładowaniu operatorów. Chciałbym zapisać to tak:

tablica_wskaznikow[size]++;

… Ale to nie działa. Co robić?

Jeśli masz tablicę wskaźników, to odwołując się do jej konkretnego elementu dostajesz wskaźnik. Do uzyskania wartości wskazywanej przez wskaźnik służy operator *

(*tablica_wskaznikow[size])++
++(*tablica_wskaznikow[size]);[/code]

, gdyż przeciążyłeś prefiksowy(nie postfiksowy, on przyjmuje jeden parametr(int)) operator dla typu klasa, nie klasa*.

@EDIT: VC++ pozwala na zdefiniowanie tylko jednej wersji i używanie go w obu sposobach, nie wiem jak standard to definiuje ani jak się inne kompilatory zachowują.

@EDIT 2: @down: good point.

Za moich czasów to się nazywało przeciążaniem operatorów, a nie przeładowaniem.

Pablo_Wawa : różne są teorie

http://pl.wikipedia.org/wiki/Przeci%C4% … tor%C3%B3w patrz: Problem nazwy

Ależ ja przecież nie twierdzę, że autor używa niepoprawnej nazwy - ja na studiach (i później) nie spotkałem się z tą nazwą (przeładowanie operatora), ale przyjmuję do wiadomości, ze i taka jest stosowana. :slight_smile:

@177, przeładowanie to dosłowne tłumaczenie z angielskiego - więc stosowanie tego nie jest poprawne.

Na przykład przechodzenie infiksowe (ang. in-order, w-porządku). Czy poprawne jest stosowanie wyrażenia: “przechodzenia w-porządku”

Dzięki za pomoc. Jak będę miał jeszcze jakieś pytania co do operatorów odświeżę temat.

PS: moim zdaniem poprawne jest nazewnictwo według Symfonii.

Dodane 18.12.2012 (Wt) 20:23

Mam kolejny problem - nie mogę użyć operatora przypisania (=). Przeładowałem go tak:

klasa & klasa::operator=(klasa **& tab)

{	

	if(this != *tab)

	{

		for(int i = 0; i < size; i++)

		{			

			delete this[i].wsk;

			this[i].wsk = new klasa_zagniezdzona;

			this[i].a = tab[i]->a;

			this[i].b = tab[i]->b;

			this[i].wsk->c = tab[i]->wsk->c;

			this[i].wsk->d = tab[i]->wsk->d;

		}


	}	

	return *this;

}

Wyświetla mi bardzo dziwny błąd:

cGP6C.jpg

O co tutaj chodzi?

This may be due to a corruption of the heap, which indicates a bug in operatory.exe or any of the DLLs it has loaded.

this[i]

raczej nie ma prawa działać(this (raczej) nie wskazuje na tablice). Przez to,

delete this[i].wsk

może próbować zwolnić pamięć, której nie zaalokował. To zadziała, jeśli size == 1(wtedy this[i] == this oraz i == 0).

Może pisząc to:

this

miałeś na myśli to:

(*this)

lub to:

this->operator

co można zapisać również tak:

operator