Rajapinnat ja olioiden välittäminen Moduulit/oliot kutsuvat toisiaan kapseloitujen rajapintojen läpi Kutsuissa välitetään usein olioita paikasta toiseen Jos olion omistus (= tuhoamisvastuu) säilyy koko ajan yhdessä paikassa, hyvä Usein kuitenkin tarve luoda olio toisella puolen rajapintaa, tuhota toisella puolella: olion omistus siirtyy rajapinnan yli Omistuksen siirtyminen dokumentoitava rajapintadokumentaatioon! 226 Olioiden ohjelmointi C++:lla, Matti Rintala & Jyke Jokinen1941
Olioiden omistus Omistuksen dokumentointi tärkeää monesta syystä: Olion tuhoamisvastuu (kielissä, jossa tätä ei ole automatisoitu) Olion vaatimat siivoustoimenpiteet (resurssien vapautus, tuhoutumisen ilmoittaminen muualle (poisrekisteröinti) yms.) = purkajan toiminnallisuus Automaattinen roskienkeruu (esim. Python) hoitaa ensimmäisen, mutta ei jälkimmäistä C++:ssa ei (vielä) roskienkeruuta ollenkaan, toisaalta purkaja hoitaa siivouksen, kunhan olio tuhotaan (ei automaattinen, jos new:llä luotu) Perinteisesti new:llä luodun olion tuhoaminen ohjelmoijan vastuulla (delete) C++11 tarjoaa omistuksen hallintaan myös älykkäät osoittimet 227 Olioiden ohjelmointi C++:lla, Matti Rintala & Jyke Jokinen1941
Omistuksen dokumentointi UML:ssä eri assosiaatiotyyppejä (tavallinen, jaettu kooste, muodostuminen... ) Assosiaatiot vaikuttavat myös olioiden omistussuhteisiin C++:ssa nykyisin useita eri tapoja viitata/osoittaa olioon (viite, osoitin, automaattiosoitin, jaettu osoitin, heikko osoitin) C++:n osoitintyypin valinnalla voi dokumentoida koodissa UML:ssä tehtyjä suunnitteluratkaisuja. Lisäksi osoitintyyppi helpottaa ko. assosiaation toteutusta. Kätevää! 228 Olioiden ohjelmointi C++:lla, Matti Rintala & Jyke Jokinen1941
Omistuksen dokumentointi C++:ssa Viite (&) Ei omistusta, ei voi olla NULL (0) Kohde säilyy samana viitteen elinkaaren ajan Ei käy STL-säiliöiden alkioksi (Assignable) Osoitin (*) Ei omistusta (tai omistuksen hallinta tehty käsin) Käy STL-säiliöiden alkioksi (Assignable) 229 Olioiden ohjelmointi C++:lla, Matti Rintala & Jyke Jokinen1941
Omistuksen dokumentointi C++11:ssa Jaettu osoitin (std::shared ptr, <memory>) Jaettu omistus usean jaetun osoittimen kesken Viimein jaettu osoitin poistaa omistettavan Varottava syklejä! (Ratkaisu: viite/heikko osoitin) Tavallinen osoitin: get(), (ei luopumista) Uusi omistus tavallisesta osoittimesta: reset() Jakotilanteen selvitys: use count(), unique() (dynamic pointer cast, static pointer cast, const pointer cast) (enable shared from this-kantaluokka) Olion luominen suoraan jaettun osoittimen päähän: std::make shared<x>(...) 230 Olioiden ohjelmointi C++:lla, Matti Rintala & Jyke Jokinen1941
Omistuksen dokumentointi C++11:ssa Uniikkiosoitin (std::unique ptr, <memory>) Omistus yksinoikeudella Omistuksen voi eksplisiittisesti siirtää kopioinnissa ja sijoituksessa (alkuperäinen tyhjenee) p2 = std::move(p1) Tavallinen osoitin: get(), luopuminen: release() Uusi omistus tavallisesta osoittimesta: reset() Olion luominen suoraan uniikkiosoittimen päähän (C++14): std::make unique<x>(...) 231 Olioiden ohjelmointi C++:lla, Matti Rintala & Jyke Jokinen1941
Omistuksen dokumentointi C++11:ssa Heikko osoitin (std::weak ptr, <memory>) Osoittaa kiinnostuksen jaettuun kohteeseen, ei riitä pitämään hengissä Kätevä jaettu osoitin -syklien rikkomiseen Kätevä myös, jos halutaan tietää onko kohde jo tuhottu Viimeinen jaettu osoitin poistaa kohteen, vaikka heikkoja osoittimia jäljellä (heikot expired()) Ei tarjoa suoraan pääsyä kohteeseen, mutta tuottaa jaetun osoittimen Jaetun osoittimen luonti: lock(), shared ptr sp(wp) (jos jo tuhottu, lock 0, sp:n luonnista poikkeus) Kiinnostuksesta luopuminen (nollaus): reset() Jakotilanteen selvitys: expired(), (use count()) 232 Olioiden ohjelmointi C++:lla, Matti Rintala & Jyke Jokinen1941