Nie rozumiem dlaczego po wprowadzeniu błędu, program bezpośrednio z "cin.fail()" i "cin.good()" wyrzuca prawidłowe informacje, |
cin.good() i
cin.fail() zwracają aktualny stan strumienia
cin.
a kiedy używam do tego zmiennych informacje są błędne. |
Wiesz gdzie problemu szukać. :)
W zasadzie nie są one błędne, a
stare.
Wytłumaczę po kolei co i jak się dzieje.
Funkcje
.fail() i
.good() są funkcjami zwracającymi wartość,
czyli upraszczając, pozostawiają po sobie konkretną wartość danego typu,
a w tym przypadku typu
bool
, który przechowuje wartość
true
lub
false
.
Zwrócona wartość jest tylko aktualna w momencie jej zwrócenia
(chodzi mi o aktualność informacji o stanie strumienia),
zatem jeśli ją gdzieś zapiszemy (np. tak jak ty to zrobiłeś)
to jeśli wykonamy kolejną akcję na strumieniu cin
zmieniającą stan strumienia (pobranej flagi sygnalizującej stan)
to zapisana kopia zacznie być różna od aktualnego stanu.
Zapisana kopia się nie będzie się samodzielnie aktualizować
(tak jak "wewnętrzne dane"
cin'a),
gdyż nie "nauczyłeś" programu jak to robić...
bool bledy = cin.fail();
bool powodzenie = cin.good();
Zmienne te przechowują kopię jednych ze stanów strumienia cin z danego momentu w czasie
i kopie będą przechowywane tam tak długo aż nie określisz kiedy zmienne mają przybrać nową wartość. :
bledy = cin.fail();
powodzenie = cin.good();
(bądź aż nie zakończy się program :D)
(// BTW: takie funkcje są nazywane metodami,
bo są ściśle powiązane ze swoją klasą.
np.
cin reprezentuje klasę strumienia,
a
.fail() i
.good() są na nim wykonywane)
Jeśli masz Skype czy jakąś inną formę kontaktu
to mogę Ci pomóc przy nauce w formie mentora.
Sam pomagam mojemu młodszemu o 5 lat
kuzynowi przy przerabianiu tego kursu.