812347A Olio-ohjelmointi, 2015 syksy 2. vsk. V Geneerisyys



Samankaltaiset tiedostot
Olio-ohjelmointi Geneerisyys. 1. Johdanto

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

12 Mallit (Templates)

STL:n uudistukset. Seppo Koivisto TTY Ohjelmistotekniikka

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

Olio-ohjelmointi Syntaksikokoelma

15. Ohjelmoinnin tekniikkaa 15.1

Listarakenne (ArrayList-luokka)

Muuttujien roolit Kiintoarvo cin >> r;

15. Ohjelmoinnin tekniikkaa 15.1

Mallit standardi mallikirjasto parametroitu tyyppi

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

Olio-ohjelmointi 2. välikoe HYV5SN

13 Operaattoreiden ylimäärittelyjä

Ohjelmoinnin perusteet Y Python

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

TIETORAKENTEET JA ALGORITMIT

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

1 C++:n standardikirjasto

int puts(char *buff) Kirjoittaa puskurissa buff \0 :lla päätetyn merkkijonon standarditulostukseen. Formatoitu konsoli-i/o Tiedostot

Esimerkki luokkahierarkiasta: C++-kielen IOstream-kirjasto

Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter

812336A C++ -kielen perusteet,

Standardi mallikirjasto

Metodien tekeminen Javalla

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Java-kielen perusteet

Harjoitustyö: virtuaalikone

Ohjelmoinnin perusteet Y Python

Osoittimet. Mikä on osoitin?

Funktiomallit Funktiomallin määrittely

18. Abstraktit tietotyypit 18.1

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu:

A TIETORAKENTEET JA ALGORITMIT

Osoitin ja viittaus C++:ssa

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Ohjelmointi 1 Taulukot ja merkkijonot

ITKP102 Ohjelmointi 1 (6 op)

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

Lyhyt kertaus osoittimista

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Mikä yhteyssuhde on?

Java-kielen perusteet

TTY Ohjelmointi I & II C++-kirjastoreferenssi versio 2.2

Java-kielen perusteet

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Kääntäjän virheilmoituksia

1 Tehtävän kuvaus ja analysointi

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Ohjelmointiharjoituksia Arduino-ympäristössä

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Sisältö. 22. Taulukot. Yleistä. Yleistä

1. Olio-ohjelmointi 1.1

Olio-ohjelmointi Javalla

ITKP102 Ohjelmointi 1 (6 op)

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

ITKP102 Ohjelmointi 1 (6 op)

UNIVERSITY OF OULU DEPARTMENT OF INFORMATION PROCESSING SCIENCE

Ohjelmoinnin perusteet Y Python

Operaattoreiden uudelleenmäärittely

C++11 lambdat: [](){} Matti Rintala

Sisältö. 2. Taulukot. Yleistä. Yleistä

VIII. Osa. Liitteet. Liitteet Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto

Taulukot. Jukka Harju, Jukka Juslin

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. I Johdanto ohjelmointiin C++kielellä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Java kahdessa tunnissa. Jyry Suvilehto

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Ohjelmoinnin perusteet Y Python

Operaattorin ylikuormitus ja käyttäjän muunnokset

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

1. C++:n STL-kirjasto

C++ tukee myös kaksoistarkkuuden ja yhden tarkkuuden liukulukutietotyyppejä:

Ohjelmointi 2 / 2010 Välikoe / 26.3

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

14. Poikkeukset 14.1

Tietueet. Tietueiden määrittely

Luokat. Luokat ja olio-ohjelmointi

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Olio-ohjelmointi Poikkeusten käsittelystä. 1. Johdanto

21. oppitunti. Esikäsittelijä. Osa. Esikäsittelijä ja kääntäjä

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Osa. Erikoisaiheet. Oppitunnit 20 Erikoisluokat ja -funktiot 21 Esikäsittelijä

Transkriptio:

812347A Olio-ohjelmointi, 2015 syksy 2. vsk V Geneerisyys

Sisältö 1. Johdanto geneerisyyteen 2. Geneeriset funktiot 3. Geneeriset luokat 4. Standard Template Library (STL) 5. IOStream-kirjasto 812347A Olio-ohjelmointi, Geneerisyys 2

V.1 Johdanto geneerisyyteen Neljäs monimuotoisuuden muoto: tietotyyppien nimet monimuotoisia Tietotyypit parametreina Paradigma (Stroustrup): Decide which algorithms you want: parameterize them so that they work for a variety of suitable types and data structures Käännösaikaista monimuotoisuutta Kutakin esiintyvää konkreettista tyyppiä kohden kääntäjä tekee oman toteutuksen Yleisimmät sovelluskohteet Tyyppiriippumattomat algoritmit Tyyppiriippumattomat säiliöluokat (kokoelmat) 812347A Olio-ohjelmointi, Geneerisyys 3

V.2 Geneeriset funktiot C++: geneerisyys ns. template-mekanismilla Esimerkki template <typename Type> Type pienempi(type t, Type u){ } if(t < u){ } return t; return u; Voidaan soveltaa mihin tahansa tietotyyppiin, joka toteuttaa operaattorin < Ohjelmassa int x=10, y=5; double d1=5.2, d2=8.2; pienempi(x,y); pienempi<double>(d1,d2); Kääntäjä tekee kaksi eri versiota funktiosta Tietotyyppi voidaan antaa eksplisiittisesti tai jättää kääntäjän pääteltäväksi 812347A Olio-ohjelmointi, Geneerisyys 4

V.2.1 Geneeriset funktiot Javassa Javassa metodi voidaan määritellä geneeriseksi public static <T> String merkeiksi (T x){ } return x.tostring(); Tyypin rajoittaminen public static <T extends Comparable<T>> T pienempi (T x, T y){ } if(x.compareto(y)<0) //Voidaan varmasti kutsua return y; return x; 812347A Olio-ohjelmointi, Geneerisyys 5

V.3 Geneeriset luokat Käytetään erityisesti säiliöluokkien ja tietorakenteiden toteuttamiseen Tyyppiturvallisuus ei tarvitse tehdä oletusta tietosäiliön olioiden tyypistä Ajonaikaiset virheet käännöksen aikaisiksi Selkeämpi luettavuus myös tyyppi näkyvissä 812347A Olio-ohjelmointi, Geneerisyys 6

V.3.1 Geneeriset luokat: toteutus Käännösaikana Suorituksen aikana Parametriluokka Kirja Geneerinen Puutietorakenne KirjaPuu IntegerPuu Integer Parametriluokka Lähde: Lasse Harjumaan luentokalvot 812347A Olio-ohjelmointi, Geneerisyys 7

V.3.2 Geneeriset luokat C++:ssa Geneerisestä luokasta käytetään myös nimitystä luokkamalli Luokkamallin kaikki funktiot ovat geneerisiä funktioita Luokkamallin olioita voidaan luoda vasta sen jälkeen kun tyyppiparametreille on annettu konkreettiset käytettävät tyypit Tällöin mallista on luotu ilmentymä tietylle tyypille Ilmentymä on tavallinen C++-luokka Tyyppiparametri voi olla mikä tahansa tietotyyppi 812347A Olio-ohjelmointi, Geneerisyys 8

V.3.2.1 Esimerkki C++: Pino malliluokkana enum PinoPoikkeus { PinoTyhja, PinoTaysi }; template<typename Type> class Pino { private: int koko; int paa; Type* pino; public: Pino(int k):koko(k),paa(0) { pino = new Type[koko]; } ~Pino(){delete[] pino;} void push(type); Type pop(); }; 812347A Olio-ohjelmointi, Geneerisyys 9

V.3.2.1 Esimerkki C++: Pino malliluokkana (2) template <typename Type> void Pino<Type>::push(Type elem){ if (paa == koko) throw PinoTaysi; pino[paa++] = elem; } template <typename Type> Type Pino<Type>::pop(){ if (paa == 0) throw PinoTyhja; return pino[--paa]; } HUOM! Koko koodi otsikkotiedostossa! 812347A Olio-ohjelmointi, Geneerisyys 10

V.3.2.1 Esimerkki C++: Pino malliluokkana (3) // Pääohjelmassa: #include PinoTemp.h // JNE.. Pino<double> dpino(3); dpino.push(1.2); dpino.push(-1.3); cout << dpino.pop() << endl; cout << dpino.pop() << endl; Pino<string> spino(3); spino.push("eka"); spino.push("toka"); cout << spino.pop() << endl; cout << spino.pop() << endl; dpino voi sisältää double-tyyppisiä lukuja 812347A Olio-ohjelmointi, Geneerisyys 11

V.3.2.2 C++: Luokkamallit ja alityypit Koodissa luokat class Luokka { }; // Luokan koodia class Aliluokka : public Luokka { }; Aliluokka on Luokan alityyppi Pääohjelmassa koodi Pino<Luokka> pino(2); Pino<Aliluokka> toinenpino(3); pino = toinenpino; // Luokan koodia Pino<Aliluokka> ei ole luokan Pino<Luokka> alityyppi: sijoitus ei ole sallittu 812347A Olio-ohjelmointi, Geneerisyys 12

V.3.3 Geneeriset luokat Javassa Alun perin Javassa ei tyyppiparametreja Mukaan vasta versiossa 1.5 Ohjelmaa käännettäessä korvataan kaikki muodolliset tyyppiparametrit todellisilla parametreilla ja poistetaan kaikki geneerisyyteen viittaava Tehdään tyyppimuunnokset Tehdään tyyppitarkistukset Toteutus poikkeaa C++:n template-mekanismista 812347A Olio-ohjelmointi, Geneerisyys 13

V.3.3.1 Pino Javalla class Pino<T> { private int koko; private int paa; private T[] pino; public Pino(int k){ koko = k; paa = 0; // HUOMAA ERO C++:aan pino = (T[])new Object[koko]; } public void push(t elem){ if (paa == koko){ throw new PinoPoikkeus("Pino täysi"); } pino[paa++] = elem; } 812347A Olio-ohjelmointi, Geneerisyys 14

V.3.3.1 Pino Javalla (2) public T pop(){ if (paa == 0){ throw new PinoPoikkeus("Pino tyhjä"); } return pino[--paa]; } public boolean empty(){ } return (paa==0); public boolean full(){ return (paa==koko); } } // Luokan Pino loppu 812347A Olio-ohjelmointi, Geneerisyys 15

V.3.3.1 Pino Javalla (3) Pääohjelmassa // Pino jossa Double-olioita Pino<Double> dpino = new Pino<Double>(3); dpino.push(new Double(1.2)); System.out.println(dPino.pop().doubleValue()); // Pino jossa String-olioita Pino<String> spino = new Pino<String>(3); spino.push("eka"); System.out.println(sPino.pop()); HUOM: Todellisen tyyppiparametrin oltava olio (ei perustietotyyppi) 812347A Olio-ohjelmointi, Geneerisyys 16

V.3.4 Tyyppiparametrin rajoittaminen ja jokerit (wild cards) Javassa C++:ssa ei voi rajoittaa tyyppiparametria Javassa rajoittaminen mahdollista, esim. class Pino<T extends Number> Mahdollista käyttää vain luokasta Number periytyviä tyyppiparametreja Javassa jokerilla? voidaan esittää tuntematonta parametrityyppiä, esim. metodi static void printandclear(pino<?> stack) { } // Voidaan kutsua millä tahansa Pino-tyypillä 812347A Olio-ohjelmointi, Geneerisyys 17

V.4 Standard Template Library Yleiskäyttöinen geneeristen algoritmien ja tietorakenteiden kirjasto Mukana lähes standardoimisprosessin alusta Tarkoituksena tarjota valmiit standardoidut ratkaisut tehokkaiden ja siirrettävien ohjelmien tekemiseen Yleisesti käytetty kirjaston perusta SGI:n tekemä ennen kuin C++ standardoitiin http://www.sgi.com/tech/stl/ Ks. myös http://www.cplusplus.com/reference http://en.cppreference.com/w/ 812347A Olio-ohjelmointi, Geneerisyys 18

V.4.1 STL:n komponentit Kirjaston pääkomponentit 1. Kokoelmat eli tietosäiliöt (taulukot, listat jne.) 2. Selaajat eli iteraattorit (kokoelmien selaamiseen) 3. Algoritmit (lajitteluun, etsimiseen jne.) Näiden lisäksi 1. Funktio-olioita Olioita, jotka käyttäytyvät kuin funktiot 2. Sovittimia eli adaptereita Vaihtavat toisen komponentin liittymää 812347A Olio-ohjelmointi, Geneerisyys 19

V.4.2 STL:n kokoelmat Kokoelmia käytetään hallitsemaan oliojoukkoja Eri tyyppisiä eri tarkoituksiin Peräkkäisrakenteiset kokoelmat [* = c++11] 1. vector 4. forward_list * 2. deque 5. array * 3. list Assosiatiiviset (avainrakenteiset) kokoelmat 1. set 2. multiset 3. map 4. multimap 5. unordered_set * 6. unordered_map * 7. unordered_multiset * 8. unordered_multimap * 812347A Olio-ohjelmointi, Geneerisyys 20

V.4.2 STL:n kokoelmat (2) Kokoelmasovittimet: toteuttavat tietorakenteen jonkin toisen tietorakenteen avulla 1. stack 2. queue 3. priority_queue Muiden tietorakenteiden (puut, verkot jne) toteuttamiseen olemassa kirjastoja Esimerkiksi boost (www.boost.org) 812347A Olio-ohjelmointi, Geneerisyys 21

V.4.2.1 Peräkkäiskokoelmat Jokaisella kokoelmalla on seuraavat julkiset metodit size() kokoelman alkioiden lukumäärä empty() onko kokoelma tyhjä? max_size() suurin mahdollinen koko begin() selaaja säiliön ensimmäiseen alkioon end() selaaja säiliön viimeisen alkion jälkeiseen alkioon rbegin() selaaja säiliön viimeiseen alkioon rend() selaaja säiliön ensimmäistä edeltävään alkioon sijoitusoperaattori 812347A Olio-ohjelmointi, Geneerisyys 22

V.4.2.1 Peräkkäiskokoelmat: vector vector<t> määrittelee dynaamisen taulukon Alkiot kaikki samaa tyyppiä T, joka määritellään käännösaikana Määritelty otsikkotiedostossa <vector> Esimerkki: kokonaislukuvektorin määritteleminen: vector<int> luvut; typedef vector<int> IntTaulu; IntTaulu luvut2; Voidaan käyttää sisäisten taulukkojen sijasta 812347A Olio-ohjelmointi, Geneerisyys 23

V.4.2.1 Peräkkäiskokoelmat: vectorin metodeja Metodi size() empty() max_size() capacity() reserve(int n) resize(int n) Kuvaus Alkioiden lukumäärä vektorissa Onko vektori tyhjä vai ei Suurin mahdollinen koko Suurin mahdollinen koko ilman uutta muistinvarausta Varaa tilaa n:lle alkiolle Luo uusia alkioita, jos n > size tai tuhoaa niitä, jos n < size 812347A Olio-ohjelmointi, Geneerisyys 24

V.4.2.1 Peräkkäiskokoelmat: vectorin luku/kirjoitusmetodeja Metodi Kuvaus operator[] at front back insert Palauttaa n:nnen alkion Heittää n:nnen alkion indeksitarkistuksen jälkeen poikkeuksen std::out_of_range, jos indeksi ei ole vektorin alueella Palauttaa ensimmäisen alkion Palauttaa viimeisen alkion Lisää väliin yhden tai useamman alkion 812347A Olio-ohjelmointi, Geneerisyys 25

V.4.2.1 Peräkkäiskokoelmat: vectorin luku/kirjoitusmetodeja (2) erase clear assign push_back operator= swap Poistaa yhden tai useamman alkion Tyhjentää vektorin Kopioi tietyt alkiot tai asettaa n kpl tiettyä arvoa Lisää viimeiseksi alkioksi Kopioi vectorin Vaihtaa sisältöjä 812347A Olio-ohjelmointi, Geneerisyys 26

V.4.2.1 Peräkkäiskokoelmat: deque Määritelty otsikkotiedossa <deque> Mallintaa kahdesta päästä avoimen listan Toteutettu yleensä taulukoiden taulukkona Samat jäsenfunktiot kuin luokassa <vector> Lisäksi push_front pop_front 812347A Olio-ohjelmointi, Geneerisyys 27

V.4.2.1 Peräkkäiskokoelmat: list Määritelty otsikkotiedostossa <list> Määrittelee kahteen suuntaan linkitetyn listan Ei määritelty operaattoria [] tai at() - jäsenfunktiota 812347A Olio-ohjelmointi, Geneerisyys 28

V.4.2.1 Peräkkäiskokoelmat: array Lisätty standardiin C++11 Otsikkotiedosto <array> Kapseloi sisäänsä kiinteämittaisen taulukon -> tehokkaampi kuin vector Etuja: Kokoelma tuntee alkioiden lukumäärän -> ei tarvitse välittää erikseen funktiolle Voidaan käyttää kokoelmien ominaisuuksia, esim. selaajat 812347A Olio-ohjelmointi, Geneerisyys 29

V.4.2.2 Selaajat Osoitinolioita, joita STL:n -algoritmit käyttävät kokoelmien alkioiden käsittelyssä Siis älykkäitä osoittimia Jokainen kokoelma määrittelee selaajansa Yleensä kokoelmaluokan sisäisenä luokkana Ei tarvita omia otsikkotiedostoja selaajien käyttöön Jokaisella selaajalla on seuraavat toiminnot *iter, alkion lukemiseen ja/tai kirjoittamiseen ++iter, selaajan siirtämiseen iter == iter1, vertailu kahden selaajan välillä 812347A Olio-ohjelmointi, Geneerisyys 30

Esimerkki: vector ja sen selaaja #include <vector> // vectorin määrittely vector<double> numbers; // Lisätään vectoriin kaksi lukua numbers.push_back(12.1); numbers.push_back(8.2); double sum = 0; // vectorin selaaja vector<double>::iterator iter; // Lasketaan vectorin alkioiden summa for(iter = numbers.begin(); iter!= numbers.end(); iter++){ } sum += *iter; 812347A Olio-ohjelmointi, Geneerisyys 31

Esimerkki: array // Geneerinen funktio joka tulostaa arrayn template <typename Type, size_t Size> void tulostaarray(const std::array<type,size> &taulu) { } for(int i = 0; i < taulu.size(); i++){ std::cout << "taulukko[" << i <<"] = " << taulu[i] << std::endl; } // Pääohjelmassa std::array<int,5> intarray = {15, 28, 11, 56, 31}; tulostaarray(intarray); 812347A Olio-ohjelmointi, Geneerisyys 32

V.5. IOStream-kirjasto IOStream-kirjasto käyttää virtapohjaista (vuopohjaista) tiedonsiirtoa Datan voidaan ajatella koostuvan virrasta samankokoisista yksiköistä Yksiköt voivat olla esim. tavuja tai merkkejä Luku- ja tulostustoiminnot voidaan ajatella käsitteellisesti olevan merkkien/tavujen virtaa ohjelmasta tai ohjelmaan 812347A Olio-ohjelmointi, Geneerisyys 33

V.5.1 IOStream-kirjaston luokista Yleiset I/O luokat basic_istream<t>, basic_ostream<t>, basic_iostream<t> Ovat siis luokkamalleja Kertovat sen kuinka I/O toiminnot tehdään mutta eivät sitä kuinka käytetään ulkoista laitetta Ohjelmissa käytetään merkkityyppiin erikoistettuja luokkia istream, ostream, iostream 812347A Olio-ohjelmointi, Geneerisyys 34

V.5.1 IOStream-kirjaston luokista (2) Tiedosto I/O luokat basic_ifstream, tiedoston lukemista varten basic_ofstream, tiedostoon kirjoittamista varten basic_fstream, luku/kirjoitus toimintoja varten String I/O käyttää string-oliota puskurina basic_istringstream basic_ostringstream basic_stringstream Kaikki edellä mainitut luokkamalleja, ohjelmissa merkkityyppiin erikoistettuja ifstream, ofstream, fstream, istringstream, ostringstream, stringstream 812347A Olio-ohjelmointi, Geneerisyys 35

V.5.2 Lukeminen ja kirjoittaminen Tapahtuu operaattoreiden << ja >> avulla Operaattorit määritelty Jäsenfunktiona sisäisille tyypeille Funktiona merkeille (char) ja merkkijonoille (char*, char[]) Funktioina muille standardikirjaston tyypeille basic_string, string, complex jne Operaattorit ylikuormitettava omille tyypeille, jos halutaan käyttää 812347A Olio-ohjelmointi, Geneerisyys 36

V.5.3. Tietovuon tila Ilmoittaa 1. Onko edellinen toiminta virheetön vai ei 2. Onko virta sisäisesti eheä Virtaan kohdistuvat toimenpiteet eivät pääsääntöisesti tee mitään jos virta ei ole toimintakuntoinen Tilaliput ilmoittavat vuon tilan: goodbit Tarkoittaa, että mikään lippu ei ole asetettu: Tällöin virta on virheettömässä tilassa eli toimintakuntoinen eofbit Ilmoittaa, että ollaan päädytty loppuun 812347A Olio-ohjelmointi, Geneerisyys 37

V.5.3. Tietovuon tila (2) failbit ilmoittaa että toiminto on päättynyt virheellisesti Vuo on muuten kunnossa badbit ilmoittaa että vuon eheys on kadonnut Ei yleensä voi ohjelmassa korjata Jokaista tilabittiä (failbit, badbit, eofbit) vastaa booltyyppinen vakiojäsenfunktio bool fail(), bool bad(), bool eof() Vielä bool good() == true jos kaikki tilabitit alhaalla 812347A Olio-ohjelmointi, Geneerisyys 38

V.5.3. Tietovuon tila (3) Voidaan tutkia suoraan käyttäen virtaolioita if (file) // jos file-tiedostovirtaolio on kunnossa if (!file) // jos file-tiedostovirtaolio ei ole kunnossa Virtaolio voidaan asettaa tilaan goodbit käyttäen jäsenfunktiota clear() Jos on luettu virhesyöte, on tilaa palautettaessa syytä tyhjentää syöte metodilla ignore() 812347A Olio-ohjelmointi, Geneerisyys 39

Esimerkki: Oman luokan tulostaminen // Henkilo.h #include <iostream> class Henkilo { }; private: public: std::string etunimi; std::string sukunimi; std::string sotu; Henkilo(std::string en,std::string sn,std::string stu); // Hajotin, saanti- ja asetusmetodit // Ylikuormitettu tulostusoperaattori std::ostream& operator<<(std::ostream &os, const Henkilo &h); 812347A Olio-ohjelmointi, Geneerisyys 40

Esimerkki: Oman luokan tulostaminen (2) // Henkilo.cpp Henkilo::Henkilo(std::string en,std::string sn,std::string stu): etunimi(en),sukunimi(sn),sotu(stu){ } // JNE // Ylikuormitetun tulostusoperaattorin toteutus // Ei ole jäsenfunktio -> käytettävä saantimetodeja std::ostream& operator<<(std::ostream &os, } const Henkilo &h){ os << h.getetunimi() <<" "<< h.getsukunimi() << std::endl; os << h.getsotu(); return os; 812347A Olio-ohjelmointi, Geneerisyys 41

Esimerkki: Oman luokan tulostaminen (3) Pääohjelmassa #include <iostream> #include "henkilo.h" using namespace std; int main() { Henkilo h("aku", "Ankka","090634-3134"); Henkilo eco("umberto","eco","050132-2212"); cout << h << endl << eco << endl; // JNE 812347A Olio-ohjelmointi, Geneerisyys 42

Esimerkki: Oman luokan lukeminen Lisätään edellä olevaan koodiin // Henkilo.h: Ylikuormitettu lukuoperaattori std::istream& operator>>(std::istream &is, Henkilo &h); // Henkilo.cpp: Lukuoperaattorin toteutus std::istream& operator>>(std::istream &is, } Henkilo &h){ std::string enimi="";std::string sunimi=""; std::string sotu=""; is >> enimi >> sunimi >> sotu; h = Henkilo(enimi, sunimi, sotu); return is; 812347A Olio-ohjelmointi, Geneerisyys 43

Esimerkki: Oman luokan lukeminen (2) Pääohjelmassa #include <iostream> #include "henkilo.h" using namespace std; int main() { Henkilo h("", "", ""); cout << h << endl << eco << endl; cout << "Anna henkilon tiedot" << endl; cin >> h; // JNE 812347A Olio-ohjelmointi, Geneerisyys 44

V.5.4 Tiedosto I/O Tiedostovirtaluokat mahdollistavat I/O toimenpiteet tiedostoihin (tai tiedoston kaltaisiin laitteisiin) Tiedosto on avattava ennen kuin sitä voidaan käsitellä Tiedosto on suljettava käytön jälkeen Tiedosto määritellään käyttäen merkkijonoa, joka esittää tiedoston nimeä Sallitut nimet käyttöjärjestelmäkohtaiset Tiedostovirtaoliot voivat olla kahdessa tilassa Suljettu (closed), virtaoliolla ei ole viittausta ulkopuoliseen tiedostoon. Avattu (opened), virtaolio on toimintakuntoinen 812347A Olio-ohjelmointi, Geneerisyys 45

V.5.4 Tiedosto I/O (2) Tiedoston avaamisen kaksi tapaa Virtaolion muodostimen avulla Virtaolion metodin open() avulla Jos tiedoston avaamisessa virhe, asetetaan failbit Jos avaus onnistunut Jäsenfunktio is_open() palauttaa arvon true Jäsenfunktio fail() palauttaa arvon false Tiedosto voidaan avata monella tavalla Esim. vain lukemista varten Säädellään avauslipuilla, ei käsitellä tässä tarkemmin Virtaolion hajotin sulkee tiedoston 812347A Olio-ohjelmointi, Geneerisyys 46

Esimerkki: Tiedoston käsittely #include <iostream> #include <fstream> // ofstream, ifstream,fstream #include <vector> #include <string> using namespace std; typedef vector<int> IntTaulu; bool tallenna(const string& nimi, const IntTaulu& luvut); bool lataa(const string& nimi, IntTaulu& luvut); 812347A Olio-ohjelmointi, Geneerisyys 47

Esimerkki: Tiedoston käsittely (2) // vector-kokoelman arvojen tallennus tiedostoon bool tallenna(const string& nimi, const IntTaulu& luvut) { ofstream file(nimi.c_str()); for (int i = 0; file.good() && i < luvut.size(); ++i) { file << luvut[i] << ; if (0 == i % 20) file << endl; } return file.good(); } 812347A Olio-ohjelmointi, Geneerisyys 48

Esimerkki: Tiedoston käsittely (3) // Tiedoston lukujen lukeminen vector-kokoelmaan bool lataa(const string& nimi, IntTaulu& luvut) { luvut.clear(); ifstream file(nimi.c_str()); while (file.good() &&!file.eof()) { int luku; file >> luku; if (file.good()) luvut.push_back(luku); } return file.good() file.eof(); } 812347A Olio-ohjelmointi, Geneerisyys 49

V.5.5 Muistipohjainen I/O Käytetään stringstream-luokkia Määritelty otsikkotiedostossa <sstream> Voidaan alustaa joko alkuarvon kanssa tai ilman Alkuarvo kopioidaan sisäiseen puskuriin (string) Kun vuohon kirjoitetaan, puskuria kasvatetaan tarvittaessa Puskurin sisältö (string) voidaan millä tahansa hetkellä lukea jäsenfunktiolla str() Voidaan käyttää tyypinmuunnoksena muuntamaan tietotyyppi merkkijonoksi ja päinvastoin Voidaan käyttää apuna syötteen jäsentämisessä 812347A Olio-ohjelmointi, Geneerisyys 50

Esimerkki. stringstream: tietotyypin arvon muuttaminen merkkijonoksi template<class T> string converttostring(const T& t) { } stringstream strm; strm << t; return strm.str(); 812347A Olio-ohjelmointi, Geneerisyys 51

Esimerkki. stringstream: merkkijonon muuttaminen tietotyypin arvoksi template <typename T> T convertfromstring(const string& str) { } stringstream strm(str) T tmp; strm >> tmp; return tmp; 812347A Olio-ohjelmointi, Geneerisyys 52