Smercz
(Kubal92)
16 Grudzień 2012 19:06
#1
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ć?
nr47
(Sawyer47)
16 Grudzień 2012 19:12
#2
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])++
Fiolek
(Fiołek)
16 Grudzień 2012 19:15
#3
++(*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.
177
(Copycona)
16 Grudzień 2012 21:00
#5
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.
_alex
([alex])
16 Grudzień 2012 21:28
#7
@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”
Smercz
(Kubal92)
16 Grudzień 2012 21:42
#8
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:
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.
Fiolek
(Fiołek)
21 Grudzień 2012 19:44
#9
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 ).
_alex
([alex])
21 Grudzień 2012 19:54
#10
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