Podwójne deklaracje metody operator[]

0

Witam,
Nie do końca rozumiem potrzebę deklarowania i definicji dwóch metod: operator [],

double & Student::operator[ ](int i)
}
     return ArrayDb :: operator [ ] (i); 
}
double Student::operator[ ] (int i) const
{
     return ArrayDb: :operator[ ] (i);
}

czy ktoś mógłby mi wytłumaczyć jaki jest cel deklarowania i definiowania metody const, która zwraca wartość obiektu? Czy metoda zwracająca referencję do obiektu nie jest wystarczająca? (Przykład z książki S. Prata).

2

Zwróć uwagę na typ zwracany. Jest jedna malutka, ale istotna różnica, która powinna wyjaśnić o co chodzi.

FYI przeciążanie operatorów to złoto głupców (błyszczący feature języka, który niczego nie uczy i ma bardzo wąskie zastosowanie), a biorąc pod uwagę nazwę klasy Student to ktoś się za bardzo napalił na tę funkcjonalność C++.

I jeszcze jak patrzę na implementację tego operatora, to WAT? Co ty masz tan przekombinowane? To jest programistyczny kwiatek.
Wygląda na to, że masz zbędną redefinicję tego operatora i jeszcze dziwniejsze dziedziczenie.

0

To nie jest mój kod, a kod z książki Stephena Praty. Widzę, że rózni się typem zwracanym, i nie rozumiem jakie ma zastosowanie metoda zwracająca wartość a nie referencję? Wydaje mi się, że kompilator spotykając w programie użycie operatora [ ] użyje metody zwracającej referencję, nie rozumiem w jakiej sytuacji kompilator użyje definicji metody const zwracającej wartość?

0

Jak masz obiekt typu Student to zastosowanie ma pierwszy operator[], który zwraca double& więc możesz zrobić coś takiego:

Student student;
student[123] = 1.0;

a jak masz const Student to drugi operator[] zwróci ci zwykłego double, i takie przypisanie nie będzie możliwe.

0

No nie będzie możliwe. Ale po co deklarować tą drugą metodę? O ile dobrze rozumiem bez niej i tak nie było by możliwe takie przypisanie do obiektu const.

1

A spróbuj :​)

1
kq napisał(a):

A spróbuj :​)

Dokładnie. Skoro Prata do ciebie nie przemawia, to my też cię nie przekonamy.
Zamiast czytać na sucho bierz kod buduj modyfikuj i sprawdzaj jakie są problemy.
Źródła możesz znaleźć np tu https://github.com/ThomasTerebesi/PrimerPlus/tree/master/Chapter%2014/Examples

0

Macie rację, dzięki za odp.
P.S. @MarekR22 , do Ciebie tez chyba Prata nie przemawia:) "To jest programistyczny kwiatek".

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