- TituCPP 8. luento 15.11.
- Materiaali
- Esimerkit
- Lisää rajapinnoista
- oliot vs luokat
- olioiden attribuutit ovat yksilöllisiä jokaiselle oliolle
- joskus on tarvetta käyttää tietoa, joka yhteistä koko luokalle -> staattiset metodit ja muuttujat
- esim. vakiot, debug-tiedot (luokan instanssien määrän laskenta jne)
- singleton-suunnittelumalli: staattinen metodi, joka vastaa luokan instanssin alustuksesta niin, että luokasta tehdään _vain yksi_ instanssi (esim. globaalit konfigurointitiedot)
- [ http://www.dofactory.com/Patterns/PatternSingleton.aspx ]
- luokkien rajapinnoista (osittain kertausta)
- typedef-arvoilla määriteltävissä omia tyyppejä
- ulkoinen rajapinta näyttää pysyvältä, jos sisäisessä toteutuksessa pieniä muutoksia
- ystävät
- c++ faq: Try thinking of a friend function as part of the class's public interface
- [ http://www.parashift.com/c++-faq-lite/friends.html ]
- ystäväfunktioiden käyttöä voi vältää tekemällä saantimetodeja tai muita apumetodeja varsinaisen luokan sisälle
- ks. moniste, luku 18.6
- [ http://www.mit.jyu.fi/vesal/kurssit/cpp/moniste/html/m-18_6.htm ]
- huom. ystävän käyttö saattaa kuitenkin olla saantimetodia järkevämpää, jos saantimetodi ei muuten kuuluisi luokan rajapintaan - tilanteesta riippuen voi olla parempi, että pääsy luokkaan sallitaan vain tietylle funktiolle kuin että paljastetaan attribuutin arvo "kaikille".
- ystävät vs staattiset metodit vs tavalliset metodit (stroustrup, operaattorien kuormittaminen -luku):
- ystävät pääsevät käsittelemään luokan private-osaa
- staattiset metodit ovat lisäksi luokan viittausalueella (= kirjoitettu luokan "sisään")
- tavallisilla metodeilla edellisten lisäksi this-osoitin käytössä
- Dynaamisuus ja tietorakenteet
- Moniste, luku 17
- [ http://www.mit.jyu.fi/vesal/kurssit/cpp/moniste/html/m-Tiedosto.htm ]
- staattinen vs. dynaaminen muistinkäyttö
- staattista (tai pinomuistia) käytössä tavallisilla muuttujilla ja viitteillä, muisti vapautetaan muuttujan lohkosta poistuttaessa (huom. tässä sanaa "staattinen" käytetään eri merkityksessä kuin luokkamuuttujilla (ja muitakin merkityksiä c++:ssa on))
- kaikki oliot sijaitsevat dynaamisessa (tai keko) muistissa, varaus new:lla, vapautus deletellä
- c:n malloc/free:tä ei pidä käyttää, koska eivät kutsu konstruktoria/destruktoria
- Monisteen dyna-esimerkit (mallia harkkatyön tietorakenteita varten)
- [ http://www.mit.jyu.fi/vesal/kurssit/cpp/moniste/esim/dyna/ ]
- HT-vaiheet 3&4
- Tiedostot ja tietovirrat
- ks. c++ reference
- [ http://www.cplusplus.com/reference/iostream/ ]
- abstraktio: "tietovirrat" voivat sisältää näppäimistön luvun, tiedoston käsittelyn, yleisen merkkijonon käsittelyn tai vaikka verkkoon jollain protokollalla luettavaa/kirjoitettavaa dataa
- cin, cout ja cerr ovat etukäteen luotuja istream ja ostream-luokkien olioita => virtojen käsittelyssä ei sinänsä ole mitään "uutta"
- esim. luettava tiedosto määritellään c++:ssa luomalla uusi ifstream-olio ja käyttämällä sitä cin-olion tapaan
- <<- ja >>-operaattoreilla mikä tahansa olio voidaan lukea tai kirjoittaa virtaan
- alkuperäisessä luokassa ei välttämättä tarvitse ottaa edes kantaa, millaiseen virtaan kirjoitetaan => samalla metodilla sekä näytölle että tiedostoon kirjoitus
- mahdollistavat myös monipuoliset muotoiluoperaatiot (width, fill, precision, tasaukset jne)
- oliopohjainen yleistys c:n printf-muotoiluista
- käytännössä virtojen käsittelyssä tulee kuitenkin ongelmia, jos luettava data ei ole odotettua muotoa
- Moniste, luku 19
- [ http://www.mit.jyu.fi/vesal/kurssit/cpp/moniste/html/m-Kerho_oh.htm ]
- Merkkijonopohjainen tiedostonkäsittely
- Moniste: tiedostoesimerkit
- Tied_ka (vrt. luku näppäimistöltä)
- Sanalaskuri
- perinteinen "filtteri" - ohjelma ei ota kantaa syötteiden/tulosteiden muotoon
- komentoriviltä kutsumalla voitaisiin ohjata tiedostoon/tiedostosta
- Yhdistämällä filttereitä putkilla voidaan "koota" helposti "piiput ja filtterit"-arkkitehtuurin mukaisia kokonaisuuksia (esim monet unix-komentoriviohjelmat, skriptaus)
- Tiedoston yhdellä rivillä monta kenttää: Erota-funktio revisited...
- Yleismalli: lue tiedostoa rivi kerrallaan (getline) ja käsittele rivillä olevat tiedot (sscanf) - vältetään pelkän cin-virran käytön ongelmat
- [ http://www.mit.jyu.fi/vesal/kurssit/cpp/moniste/html/m-17_5_2.htm ]
- xml-tiedostojen käsittely on hieman vaativampaa, koska elementtien sisältö voi jakautua useammalle riville
- esim. dom-rajapinnassa xml-tiedosto jäsennetään puuksi, jonka solmuja ovat elementit ja tekstiosiot - attribuutit ovat elementtisolmujen "kenttiä"
- Merkkijonosta tietovirta: stringstream