konwersja strumienia na void*

0

Staram sie zrozumieć wycinek z thinking In C++ tom 2. Chcialbym ustalic co sie dzieje po kolei. To co jest w książce w ogole do mnie nie przemawia. To co w ksiazce sie dzieje po kolei można podsmowac.

Całe wyrazenie to jest

int i;
while (myStream >> i)
    cout << i <<endl;
  1. "operator >>() zwraca strumien ze swojego argumentu" - czyli rozumiem ze jak jest myStream >> i to zawartosc myStream musi byc w jaki sposob konwertowana zeby zainicjalizowac int i.
  2. "Funkcja ios_base::operator void*() po prostu wywoluje na rzecz strumienia funkcje good() i zwraca jej wynik" - tego nie rozumiem w jaki sposob i w jakim celu i konkretnie co jest rzutowane na void* ?
  3. "Funkcja ios_base::operator void* po prostu wywołuje na rzecz strumienia funkcje good() i zwraca jej wynik." - czym tutaj jest strumien ? to jest "myStream", "i" czy wynik myStream >> i

Przepraszam za chaotyczny sposob pisania, aczkolwiek nie wiem jak to lepiej przedstawic. Po prostu w celu zrozumienia tej całosci musze dobrze zrozumiec co konkretnie krok po kroku jest robione.

20220907_124058.jpg20220907_124126.jpg

2
Patryk Zc napisał(a):
  1. "operator >>() zwraca strumien ze swojego argumentu" - czyli rozumiem ze jak jest myStream >> i to zawartosc myStream musi byc w jaki sposob konwertowana zeby zainicjalizowac int i.

Wg mnie jest to chropowate tłuamczenie, choć nie jest nieprawdziwe.
"zwraca strumień" tzn że możliwe jest w jednym wierszu (statemencie) wywołanie i wykonanie wielokrotnie cin >> a >> b
a wykonanie czynności użytecznej, czyli operator >> czyli odczyt to efekt uboczny.

W języku obiektowym, który nie ma przesilanych operatorów, by się to pisało przez metody (w C++ rwnież, trzeba zadbać w metodach o referencję)

Ala.ma(kota).ma(psa)

Aby to było możliwe, metoda ma() musi zwracać referencję do obiektu.

class Ala {  
     Ala & ma(const Cosik & coMa);
}

Żeby nie zaplątać a rozjaśnić: odczyt danych ze strumienia, to nie "zwracanie", a "czynnośc uboczna" czy "efekt uboczny". Tak jak akcja wykonywana w metodzie - czymś skutkuje, ale nie zmienia tożsamości obiektu

1

@Patryk Zc:

teraz dopiero się wczytałem w tytuł.

Konwersja typowo obiektowych konstrukcji na void * to jedna z głupszych czynności, jakie można zrobić / oczekiwać w C++.

To liczenie jajek razem ze śliwkami. Wbijanie gwoździ za pomocą zegarka (nic, że ze stali nierdzewnej). Kompatybilność technologii rózniacych się o epokę. (chora kompatybilność C/C++)

1

Ad 1. Czyli zamiast pisać: myStream>>i; myStream>>j; myStream>>k; możesz zapisać: myStream>>i>>j>>k; tylko tyle i aż tyle.
Ad 2,3. To są szczegóły implementacji, generalnie chodzi o próbę rzutowania jawnego bądź nie na typ bool. Opisywana implementacja pośrednia poprzez void* który z kolei już można użyć w warunku.

1

Ta książka jest z 2004 roku. Do tego to tłumaczenie pierwszej edycji, a była także druga edycje. A samo tłumaczenie ... jak to Helion.

oryginalny zapis: https://web.mit.edu/merolish/ticpp/TicV2.html#_Toc53985679

Polecam czytać jednak po angielsku.

0

Ad 2,3. To są szczegóły implementacji, generalnie chodzi o próbę rzutowania jawnego bądź nie na typ bool. Opisywana implementacja pośrednia poprzez void* który z kolei już można użyć w warunku

Rozumiem że jak mam while(x) to x musi byc ostatecznie rzutowany na bool-a czyli na poczatku rzutujemy na void* a nastepnie w implementacji tego rzutowania wywołujemy funkcje good ktora zwraca nam bool-a. Czy my musimy zaimplementowac operator rzutowania na void* ? Czy to jest w standardowej bibliotece juz zrobione ?

Dalej nie rozumiem dlaczego musimy to rzutowac na void*, nie istnieje jakis inny ludzki sposob ?

1

Nie! Implementacja ios_base::operator void*() musi zwrócić wartość typu void* zaś taką wartość można użyć w warunku.
Teraz już nie ma tego void* porównaj implementację C98 z C11 tu https://cplusplus.com/reference/ios/ios/operator_bool/
Nie rozumiem czemu próbujesz uczyć się z książki która traktuje o standardzie sprzed prawie 25 lat (właściwie to z poprzedniego tysiąclecia)?
Dla informatyki 25 lat to bardzo duży okres czasu, to tak jakbyś próbował nauczyć się medycyny z traktatów Abu Ali ibn Sina: https://en.wikipedia.org/wiki/Avicenna

1

Thinking in C++ nigdy nie była uznawana za dobrą książkę. Jej główną (jedyną?) zaletą było to, że można ją było legalnie pobrać za darmo.

Jeśli zaczynasz się uczyć - sugeruję jedną z tych dwóch pozycji

Stroustrup - "Programowanie. Teoria i praktyka z wykorzystaniem C++"
Lippman, Lajole, Moo - "C++ Primer" (nie wiem czy jest polskie tłumaczenie)

https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list

0

Ok, rozumiem ze ksiażka jest już zbyt stara, przerzuce sie na cos innego, jednakże chcialbym do konca zrozumieć bo to mnie strasznie meczy. Ostatnia rzecz ktorej nie rozumiem dotyczy tego co zostało napisane

"Nie! Implementacja ios_base::operator void*() musi zwrócić wartość typu void* zaś taką wartość można użyć w warunku." - tzn. w implementacji tego operatora jest wywolywanie funkcji good() i rzutowanie tego co zwroci (bool) na void* ?

1
Patryk Zc napisał(a):

... tzn. w implementacji tego operatora jest wywolywanie funkcji good() i rzutowanie tego co zwroci (bool) na void* ?

Przecież podałem link https://cplusplus.com/reference/ios/ios/operator_bool/ doprawdy tak trudno przeczytać?

Return Value
C++98
A null pointer if at least one of failbit or badbit is set. Some other value otherwise.

Może jeszcze przetłumaczyć?

1

ok, dziekuje wszystkim za pomoc

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