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.

208 ROZDZIA 6 • PISANIE PROGRAMU<br />

miejsca do przechowania jednego tokenu i wskanika oznaczajcego, czy to miejsce jest wolne<br />

czy zajte:<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 (funkcja get() zostaa zdefiniowana w innym miejscu).<br />

void putback(Token t); // Wkada token z powrotem.<br />

private:<br />

bool full; // Informuje, czy w buforze jest token.<br />

Token buffer; // Miejsce do przechowywania tokenu zapisanego w strumieniu za pomoc funkcji<br />

//putback().<br />

};<br />

Teraz moemy zdefiniowa (napisa) nasze trzy funkcje skadowe. Konstruktor i funkcja<br />

putback() bd atwe, poniewa maj mao do zrobienia. Dlatego zajmiemy si nimi na pocztku.<br />

Konstruktor ustawia tylko zmienn full na warto oznaczajc, e bufor jest pusty:<br />

Token_stream::Token_stream()<br />

:full(false), buffer(0) // Bufor jest pusty.<br />

{<br />

}<br />

Jeli definicja skadowej znajduje si poza definicj klasy, naley wskaza, do której klasy ma<br />

nalee. Suy do tego nastpujca notacja:<br />

nazwa_klasy::nazwa_skadowej<br />

Tutaj definiujemy konstruktor klasy Token_stream. Konstruktor to funkcja skadowa o takiej<br />

samej nazwie, jak klasa, do której naley.<br />

Po co definiowa skadow poza klas? Przede wszystkim dla zachowania przejrzystoci<br />

— w definicji klasy mona znale gównie informacje o tym, co klasa potrafi „robi”. Definicje<br />

funkcji skadowych to implementacje okrelajce sposób, w jaki s robione róne rzeczy.<br />

Wolimy umieci je gdzie indziej, aby nie przeszkadzay. Ideaem, do którego dymy, jest,<br />

aby kada jednostka logiczna programu miecia si w caoci na ekranie. Definicje klas zazwyczaj<br />

speniaj ten wymóg, ale tylko jeli definicje ich funkcji skadowych przeniesie si gdzie<br />

indziej, poza klas.<br />

Skadowe klasy inicjuje si w licie inicjatorów skadowych (podrozdzia 6.3.3). Instrukcja<br />

full(false) ustawia skadow full na false, a buffer(0) inicjuje skadow buffer „udawanym<br />

tokenem”, który wymylilimy na poczekaniu. Z definicji typu Token (podrozdzia 6.3.3) wynika, e<br />

kady token musi zosta zainicjowany, dlatego nie moglimy zignorowa Token_stream::buffer.<br />

Funkcja skadowa putback() zapisuje swój argument w buforze strumienia Token_stream:<br />

void Token_stream::putback(Token t)<br />

{<br />

buffer = t; // Kopiuje t do bufora.<br />

full = true; // Bufor jest peny.<br />

}

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

Saved successfully!

Ooh no, something went wrong!