Czemu nie moge zrobić metody w klasie , która jest zarówno static jak i const ???????????? We wszystkich kompilatorach wyskakuje błąd z komentarzem , który mówi w telegraficznym skrócie , że tak nie można . A ja nie rozumiem dlaczego :(
Metoda static nie ma dostępu do pól nie-static klasy z założenia.
Metoda const ma dostęp read-only do tych pól.
Po co dawać więc static const??
Metoda static nie ma dostępu do pól nie-static klasy z założenia.
Metoda const ma dostęp read-only do tych pól. Po co dawać więc static const??
no wiem , ale jest taka sprawa :
mam klase ,ale taką klase w ktorej jest tylko jedna zmienna prywatna static - program tego wymaga , moze w nim byc tylko jedna ta zmienna . Skoro jest tylko jedna zmienna static , to nie ma potrzeby w ogóle tworzyć jakiegokolwiek obiektu tej klasy , wiec wszystkie metody są static . Ale chce zeby jedna z tych metod mogla TYLKO czytac wartosci tej zmiennej , majac pewnosc ze nigdy jej nie zmienia , stad const .
Faktycznie, VC++ 6 protestuje na widok:
static void function() const { ...
Przewertowałem książki, wykłady i sieć ... bez odpowiedzi.
Nie zdążyłem sprawdzić jak zachowa się g++.
najzwyczajniej idę spać.
pa
Co ciekawe nie tylko VC tak na to reaguje . Nawet stary DOSowski BC nie pozwala na taką deklaracje : static & const . Wywala taki błąd :
Conflicting Type Modifiers
Coś mi sie zdaje , że to nie kwestia kompilatora , tylko po prostu język na to nie pozwala ... Ale dlaczego ...
Temperatura 30C. Najzwyczajniej spalam się. Dlaczego tak bardzo tęsknimy za latem ... ?
To irracjonalne.
Nie mniej irracjonalny wydaje się ten problem. Oto ilustracyjny fragment kodu:
class Test {
static int var;
public:
static void function() const {
...
Każdy znany mi kompilator na widok metody statycznej i stałej protestuje ( przerywa kompilację ). Gdzie leży przyczyna? Czy taka instrukcja nie ma sensu ( i jest niedopuszczalna przez standard ), czy też może winne są nieprzewidywalne kompilatory C++?
Przeglądam więc po raz kolejny "Język C++" Stroustrupa ... strona 254
<font color="darkblue">" Zwróć uwagę na const po (pustej) liście argumentów w deklaracjach funkcji. Oznacza ono, że funkcje nie modyfikują stanu obiektu "</span>
Doznałem olśnienia na widok jednego rzeczownika.
Kluczem jest pytanie - po co deklaruje się metody stałe ?
Pytanie proste niemniej proszę się zastanowić przez chwilę. Funkcja stała obiecuje, że nie dokona żadnych zmian w obiekcie ( a dokładniej - jego polach ). Gdyby jednak niepokorny kod takiej funkcji próbował zmienić stan obiektu, to zostanie wyświetlony stosowny błąd na etapie kompilacji.
Czy celem metody stałej jest właśnie wyświetlanie błędu w czasie kompilacji ? Wątpliwe.
Można by również przypuszczać, że metody stałe deklaruje się w celach projektowych. Taka dodatkowa informacja w nagłówku funkcji może być pożyteczna ( przy dużych projektach ) ale równie dobrze służą temu komentarze i dokumentacja.
Jeżeli utworzymy obiekt stały, to będzie mógł on odwoływać się wyłącznie do metod stałych. Taki jest właśnie sens definiowania metod stałych.
Metody stałe są więc nierozerwalnie związane z obiektami stałymi.
Wracamy do początku ... dlaczego więc nie można zadeklarować metody stałej i statycznej jednocześnie ?
Metoda stała i statyczna nie jest w stanie praktycznie realizować "stałości", stałość bowiem dotyczy obiektów stałych, tymczasem metoda statyczna działa na płaszczyźnie klasy a nie obiektów.
Mam tylko nadzieję, że więcej wyjaśniłem niż namieszałem.
No oczywiście masz racje z tym wyjątkiem , że nie uważam że stałość dotyczy tylko obiektów stałych , szczerze powiem , że nigdy nie tworzyłem obiektów stałych i nie patrzyłem na metody const z tej perspektywy . Używałem ich raczej tak żeby kod był "elegencki" , tzn ze jak nie mam zamiaru zmieniac pol obiektu to robie metode const , zeby sie nie zdarzylo ze przez pomylke je zmieniam . No ale w moim przypadku to sie odnosi zarówno do obiektów const , do zwykłych obiektów ( tak można bez problemu ) jak i klas które w ogóle nie mają egzemplarza , np. maja wszystkie pola static . A tu sie okazuje , że nie da sie tak dla metody static . Szkoda ...