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

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

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

Saved successfully!

Ooh no, something went wrong!