Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
6.8. STRUMIENIE TOKENÓW 207<br />
dla uytkowników i prywatnym dla implementatorów jest doskonaym narzdziem wspomagajcym<br />
strukturalizacj kodu. Interfejs publiczny powinien zawiera wycznie to, co jest<br />
uytkownikowi potrzebne, a wic najczciej zestaw funkcji, take konstruktorów sucych<br />
do inicjowania obiektów. Implementacj prywatn stanowi kod tych publicznych funkcji.<br />
Najczciej s to dane i funkcje wykonujce skomplikowane dziaania, o których uytkownik<br />
nie musi wiedzie i których nie musi bezporednio uywa.<br />
Rozszerzymy troch nasz typ Token_stream. Jakie wymagania powinien spenia? Bez<br />
wtpienia potrzebujemy funkcji get() i putback(), poniewa to one byy powodem, dla którego<br />
w ogóle wymylilimy co takiego jak strumie tokenów. Zadaniem typu Token_stream jest wytwarzanie<br />
tokenów ze znaków wczytywanych na wejciu. Zatem nasz strumie musi wczytywa<br />
dane ze strumienia cin. Oto najprostsza moliwa wersja typu Token_stream:<br />
class Token_stream {<br />
public:<br />
Token_stream(); // Tworzy obiekt typu Token_stream, który wczytuje dane ze strumienia<br />
cin.<br />
Token get();<br />
// Daje token (obiekt typu Token).<br />
void putback(Token t); // Wkada token z powrotem.<br />
private:<br />
// szczegóy implementacyjne<br />
};<br />
To wszystko, czego uytkownik potrzebuje do korzystania z typu Token_stream. Dowiadczony<br />
programista mógby si zastanawia, dlaczego cin jest jedynym moliwym ródem znaków<br />
— przypominamy, e zdecydowalimy si na razie pobiera dane tylko z klawiatury. Zrewidujemy<br />
t decyzj w rozdziale 7.<br />
Dlaczego zastosowalimy dugaw nazw putback() zamiast krótszej put()? Chcielimy<br />
podkreli asymetri midzy funkcjami get() i putback() — to jest strumie wejciowy, a nie<br />
co, co mona wykorzysta take do ogólnych celów zwizanych z wysyaniem danych na wyjcie.<br />
Poza tym w bibliotece istream take znajduje si funkcja putback(), a spójno nazw jest jedn<br />
z podanych cech kadego systemu. Dziki temu atwiej jest zapamitywa te nazwy i unika<br />
bdów.<br />
Po tym wstpie moemy ju utworzy typ Token_stream i uy go:<br />
Token_stream ts; // Obiekt typu Token_stream o nazwie ts.<br />
Token t = ts.get(); // Daje nastpny token ze strumienia ts.<br />
// …<br />
ts.putback(t); // Wkada token t z powrotem do strumienia ts.<br />
Mamy ju wszystko, czego potrzebujemy do napisania pozostaej czci kalkulatora.<br />
6.8.1. Implementacja typu Token_stream<br />
Zaimplementujemy trzy wymienione funkcje strumienia Token_stream. Jak bdzie si ten<br />
strumie prezentowa? Tzn., jakie dane musz by w nim przechowywane, aby spenia swoje<br />
zadanie? Potrzebujemy miejsca do przechowywania tokenów, które woymy do niego. Dla<br />
uproszczenia zaómy, e mona w nim przechowywa tylko jeden token na raz. Na potrzeby<br />
naszego programu to wystarczy (i na potrzeby wielu innych te). W zwizku z tym potrzebujemy