16.07.2014 Views

Programowanie. Teoria i praktyka z wykorzystaniem C++

Programowanie. Teoria i praktyka z wykorzystaniem C++

Programowanie. Teoria i praktyka z wykorzystaniem C++

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!