Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++
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 />
}