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.3. WRACAJC DO KALKULATORA 185<br />

};<br />

double value; // Dla liczb: warto.<br />

Token(char ch) // Tworzy Token ze znaku.<br />

:kind(ch), value(0) { }<br />

Token(char ch, double val) // Tworzy Token ze znaku i wartoci typu double.<br />

:kind(ch), value(val) { }<br />

Nie s to zwyke funkcje skadowe, tylko tzw. konstruktory. Maj tak sam nazw jak ich<br />

typ i su do inicjalizowania (tworzenia) obiektów typu Token. Na przykad:<br />

Token t1('+'); // Inicjacja zmiennej t1 — t1.kind = '+'.<br />

Token t2('8',11.5); // Inicjacja zmiennej t2 — t2.kind = '8' i t2.value = 11.5.<br />

Tekst :kind(ch), value(0) w pierwszym konstruktorze oznacza: „Zainicjuj skadow kind wartoci<br />

ch, a value ustaw na 0”. W drugim konstruktorze znajduje si tekst :kind(ch), value(val),<br />

który oznacza: „Zainicjuj skadow kind wartoci ch, a value ustaw na val”.W obu przypadkach<br />

nie trzeba robi nic wicej, aby utworzy obiekt typu Token, dlatego tre funkcji jest pusta —<br />

{ }. Specjalna skadnia inicjujca (ang. member initializer list — lista wartoci inicjujcych<br />

skadowe), która zaczyna si dwukropkiem, jest uywana tylko w konstruktorach.<br />

Zauwa, e konstruktor nie zwraca wartoci. Dlatego nie trzeba (a nawet nie mona) definiowa<br />

typu zwrotnego konstruktora. Wicej na temat konstruktorów napiszemy w rozdziaach<br />

9.4.2 i 9.7.<br />

6.3.4. Uywanie tokenów<br />

Moe spróbujemy dokoczy nasz kalkulator! Chocia warto by byo najpierw opracowa jaki<br />

plan dziaania. Jak bdziemy wykorzystywa obiekty typu Token w programie? Moemy<br />

wczyta dane wejciowe do wektora takich obiektów:<br />

Token get_token(); // Wczytuje token ze strumienia cin.<br />

vector tok; // Tutaj bdziemy zapisywa tokeny.<br />

int main()<br />

{<br />

while (cin) {<br />

Token t = get_token();<br />

tok.push_back(t);<br />

}<br />

// …<br />

}<br />

Teraz moemy wczyta wyraenie w caoci i dopiero po tym obliczy jego warto. W przypadku<br />

11*12 otrzymamy co takiego:<br />

W strukturze tej moemy znale operator i jego operandy. Gdy to zrobimy, z atwoci wykonamy<br />

dziaanie mnoenia, poniewa liczby 11 i 12 zostay zapisane jako wartoci liczbowe, a nie<br />

acuchy.

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

Saved successfully!

Ooh no, something went wrong!