Lataa esitys
Esittely latautuu. Ole hyvä ja odota
JulkaistuErkki Salminen Muutettu yli 9 vuotta sitten
1
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi71 Olio-ohjelmointi 2. osa: diat 71-110 (2. välikoe) KYMENLAAKSON AMMATTIKORKEAKOULU Jarkko Ansamäki, 2001
2
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi72 Läpikäytävät asiat Olioiden kommunikaatio Perintä ja olion koostuminen osaolioista Tiedostojen käsittely Virheiden käsittely Debuggaus Nopea tutustuminen Windows- ohjelmointiin. Muuta?
3
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi73 Olioiden kommunikaatio Viesti = oliolle lähetetty luokkaan kuuluvan aliohjelman (funktion) kutsu. Aliohjelma käsittelee sen olion tietojäseniä, jolle kutsu on saapunut. Eri kutsukerroilla sama aliohjelma voi siis käsitellä eri olioiden tietojäseniä. Toteutuu this-osoittimen avulla.
4
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi74 this-osoitin Osoitin on C++ kielessä valmiiksi esitelty: Luokan_nimi *const this; Osoitin pitää sisällään kutsutun olion muistiosoitteen. void Luokka::Tulostus2(){ cout Tulostus1(); }
5
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi75 this-osoittimen käyttö Käytännössä this-osoittimella on kaksi käyttötarkoitusta: 1. Osoitinta voidaan käyttää viestinvälityksessä, jos esimerkiksi kutsuttava olio tarvitsee kutsuvan olion muistiosoitetta johonkin. 2. Osoitinta voidaan käyttää apuna testausvaiheessa kun halutaan esimerkiksi selvittää olioiden olemassaoloaikoja.
6
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi76 Tehtävä 16 Toteuta Testi-luokka siten, että luokan oletusmuodostin ilmoittaa uuden olion syntymisestä muistipaikkaan sejase ja luokan tuhoaja ilmoittaa olion kuolemisesta muistipaikassa sejase. Tee sitten seuraavanlainen pääohjelma: void main(){ Testi eka, *toka; cout<<”\n”; toka=new Testi; delete toka; cout<<”\n\n”; }
7
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi77 Olion palveluiden kutsuminen olion sisältä. Luokassa määritellyt funktiot ovat suoraan käytettävissä muista luokan funktioista käsin. Esimerkiksi: private: int a; void T(){ cout<<”Traa”; } public: void A(int x){ a=x; } void T2(){ T(); cout<<a; } Myös funktioita voidaan siis sijoittaa private-näkyvyysalueelle (luokan sisäiseen käyttöön).
8
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi78 Toisen olion käsittely olion sisältä Viestin saaneen olion lisäksi aliohjelmissa on mahdollista käsitellä myös parametrina välitetyn olion tietoja. Olion välitys parametrina toteutetaan osoitin- tai viittausmuuttujan avulla. Asiaa opiskellaan opettajajohtoisesti laadittavien esimerkkikoodien avulla.
9
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi79 Tehtävä 17 Lisää Henkilo-luokkaan palvelu, joka tulostaa yhden valitun (esim. sukunimen perusteella) henkilön tiedot. Muuta tietojen tulostus –palvelua niin, että se käyttää hyväkseen tätä uutta palvelua.
10
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi80 Tehtävä 18 Lisää Henkilo-luokkaan palvelut, jotka palauttavat pyydetyn henkilön: etunimen sukunimen osoitteen puhelinnumeron… Lisää Henkilo-luokkaan palvelu, jolla henkilön tietoja voi hakea esimerkiksi nimen perusteella.
11
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi81 Perintä Perinnässä johdetaan olemassa olevasta (tai varta vasten periytettäväksi tehdystä) luokasta uusi tarkoitusperiin sopiva luokka. Seuraavalla dialla yksinkertainen esimerkki julkisesta perinnästä.
12
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi82 Esimerkki perinnästä #include class VanhaLuokka{ int a; public: void Aseta(int x){ a=x; } int Palauta(){ return a; } }; class UusiLuokka : public VanhaLuokka{ public: void Lisaa(int x){ Aseta(x+Palauta()); } }; void main(){ UusiLuokka Oolio; Oolio.Aseta(2); Oolio.Lisaa(3); cout<<Oolio.Palauta(); }
13
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi83 Huomioita esimerkkikoodista class UusiLuokka : public VanhaLuokka{… Kaksoispiste, sana public ja kantaluokan nimi ilmaisevat perintäsuhteen. Toinen harvinaisempi perintätapa on yksityinen (private) jota kurssilla ei (luultavasti) käsitellä. UusiLuokan oliolla on käyttöoikeus VanhaLuokan julkisiin jäseniin, mutta esimerkiksi a:n käsittely suoraan ei onnistu vaan pelkästään julkisten palveluiden kautta.
14
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi84 Tehtävä 19 Periytä VanhaLuokka-luokasta uusi luokka, jossa palveluina lisäksi uuden luvun vähentäminen aikaisemmasta a:n arvosta. vanhan a:n arvon kertominen syötteenä saatavalla luvulla.
15
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi85 Virtuaalifunktiot virtual-sana kertoo funktion olevan virtuaalisen jäsenfunktion. =0 –merkintä tarkentaa funktion puhtaaksi virtuaalifunktioksi (pure virtual function). Puhtaita virtuaalifunktioita (abstraktit toiminnot) sisältävään luokkaan ei voi tehdä olioita, vaan luokasta on periytettävä uusia luokkia joissa määritellään virtuaalifunktioiden toteutus.
16
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi86 Esimerkkikoodi #include class Lauseke{ public: virtual void Tulosta(ostream &) const = 0; virtual double Arvo () const = 0; }; class Ynnaa : public Lauseke{ double eka, toka; public: Ynnaa(double x, double y) : eka(x), toka(y){} void Tulosta (ostream &s) const { s<<eka<<"+"<<toka; } double Arvo () const{ return(eka+toka); } }; void main(){ Lauseke *lauseke; lauseke=new Ynnaa(2, 3); lauseke->Tulosta(cout); cout Arvo(); }
17
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi87 Huomioita koodista (kantaluokka) Funktiot ovat vakiofunktioita (const), koska ne eivät muuta lauseketta, jolle niitä kutsutaan. Lauseke-luokka siis esittelee kaksi funktiota, mutta ei määrittele niille mitään toimintaa. Tulosta-palvelulle määritellään parametrin arvoksi tulostusvirtaan osoittava muistiosoite.
18
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi88 Huomioita koodista (johdettu luokka) Luokkaan on määritelty tarvittavat tietojäsenet (eka ja toka) Perityssä luokassa määritellyille palveluille on kirjoitettu metodit. Myös luokan muodostin määritellään Huomaa arvojen kopioiminen ’otsikkorivissä’: Ynnaa (double x, double y):eka(x),toka(y){…}
19
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi89 Huomioita koodista (käyttö) Pääohjelmassa luotu osoitin kantaluokkaan. Myös johdetun luokan olio on eräänlainen kantaluokkansa olio, joten tämä onnistuu. Luodaan uusi Ynnaa-luokan olio. Huomaa cout:n käyttö Tulosta-funktion kanssa.
20
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi90 Tehtävä 20 Lisää äsken esiteltyyn esimerkkikoodiin luokat vähennys-, kerto- ja jakolaskua varten. Testaa luokkien toiminta.
21
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi91 (epäpuhtaat) virtuaalifunktiot Muillekin, kuin puhtaille virtuaalifunktioille voi kirjoittaa uuden merkityksen periytetyssä luokassa. Johdetun luokan funktioiden lisäksi voidaan nyt kutsua myös kantaluokan funktioita kertomalla toteutuksessa halutun luokan nimi.
22
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi92 Esimerkkikoodi #include class Yliluokka{ int a; public: void Aseta(int x){ a=x;} virtual int Palauta() { return a; } }; class Aliluokka:public Yliluokka{ public: int Palauta(){ return(Yliluokka::Palauta());}; }; void main(){ Aliluokka juu; juu.Aseta(2); cout<<juu.Palauta(); }
23
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi93 protected-näkyvyysalue protected: -lohkossa olevat tietojäsenet ja funktiot ovat suojattuja. protected-jäsenet ovat käytettävissä luokan sisällä ja luokasta johdetuissa luokissa. protected-jäsenet eivät siis varsinaisesti ole osa luokan käyttöliittymää, koska ne eivät ole käytettävissä luokan ulkopuolella kuten public-jäsenet.
24
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi94 Tehtävä 21 Lisää tehtävän 19 VanhaLuokka- luokkaan protected-näkyvyysalueeseen funktio Nollaus, joka asettaa a:n arvoksi nollan. Lisää tämän jälkeen johonkin periytettyyn luokkaan Nollaa-palvelu, joka kutsuu Nollaus-funktiota ja testaa toiminta. Mieti, voitko käyttää perintää henkilörekisteriohjelmassasi?
25
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi95 Osista kokonaisuus Toinen hierarkkinen luokkien välinen suhde on koostumissuhde, jossa jonkin luokan jäseninä on jonkin toisen luokan olioita. Esimerkiksi korttipakassa on 52 kortti- oliota, lentokoneessa 0-4 lentokoneenmoottori-oliota. Toteutus käyttämällä toiseen luokkaan kuuluvia olioita (tieto)jäseninä.
26
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi96 #include class Osa{ char nimi[20]; public: Osa(){ cout >nimi; } char *Palauta(){return nimi;} }; class Kokonaisuus{ Osa eka, toka; char nimi[20]; public: Kokonaisuus(){ cout >nimi; } void Tulostus(); }; void Kokonaisuus::Tulostus(){ cout<<nimi<<":\n"<<eka.Palauta()<<endl<<toka.Palauta()<<endl<<endl; } void main(){ Kokonaisuus juttu; juttu.Tulostus(); }
27
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi97 Osaolioiden käyttö Yksinkertaisissa tapauksissa automaattiset oliot riittävät, mutta heti kun halutaan tehdä hieman monimutkaisempia asioita, täytyy siirtyä dynaamisen muistinhallinnan ja osoittimien käyttöön. Osaolioiden luonti tarvittaessa. Tarvittavien osaolioiden määrän epävarmuus Muualla luotujen olioiden sitominen osaksi toista oliota. Tutustuminen asiaan esimerkkikoodien avulla.
28
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi98 Tehtävä 22 Tee olio Sana-luokkaan. Sana-luokka koostuu Kirjain-luokan olioista. Mieti mitä palveluita tarvitaan missäkin luokassa ja miten asiat toteutetaan, jotta olio olisi joustava ja käyttökelpoinen. Pisteiden haalimista varten voit tehdä puhelinmuistioosi ystäväryhmäluokan, jonka oliot koostuvat useammasta henkilöluokan oliosta.
29
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi99 Tiedostojen käsittely Tällä kurssilla käsitellään kahta eri keinoa tiedostojen käsittelyyn: fstream-kirjastoa: http://www.kyamk.fi/~zjaan/kurssit/o- o/tiedostot/siframes.htm http://www.kyamk.fi/~zjaan/kurssit/o- o/tiedostot/siframes.htm MFC-kirjastoista löytyvää Cfile-luokkaa.
30
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi100 Tehtävä 23 Tutustu Visual Studion ohjeistuksesta CFilen käyttöön. Selvitä ainakin seuraavat asiat: Tarvittava kirjasto. Luokan tarjoamat palvelut. Tiedoston avaus (ja tärkeimmät avausliput). Tiedostoon kirjoitus. Tiedostosta lukeminen.
31
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi101 Esimerkkiongelma Toteutetaan ohjelma, jonka avulla voidaan kirjoittaa muutama rivi tekstiä tiedostoon tai lukea olemassa oleva tiedosto ja tulostaa tiedoston sisältö näytölle.
32
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi102 Tehtävä 24 Mietitään yhdessä, miten puhelinmuistioiden levytallennukset kannattaisi toteuttaa.
33
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi103 Virheiden käsittely Ajonaikaisia C++ -ohjelman virhetilanteita voi käsitellä poikkeusten (exception) avulla. MFC on tuonut jotain uusia keinoja poikkeusten hallintaan, mutta vanha hyvä keino on try-catch –lohkojen käyttö.
34
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi104 Esimerkkikoodi #include void main(){ int tulos, luku=4, jakaja=0; try{ if (jakaja==0) throw(jakaja); tulos=luku/jakaja; cout<<"Tulos on: "<<tulos<<endl; } catch(int jakaja){ cout<<"\nJakaja ei voi olla: "<<jakaja; cout<<"Anna uusi jakaja: "; cin>>jakaja; if(jakaja==0) throw; cout<<"\nJakaja OK!\n"; }
35
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi105 Esimerkin läpikäyntiä Koodin ’vaarallinen’ osuus on sijoitettu try- lohkoon. Jos virhetilanne huomataan ’heitetään’ poikkeus throw-komennolla. Tässä tapauksessa poikkeus on siis int-tyyppinen tieto: jakaja. catch-lohko ’sieppaa’ poikkeuksen, mikäli käsittelijä on samaa tyyppiä kuin heitetty poikkeus. throw ilman parametria aiheuttaa ohjelman keskeyttämisen.
36
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi106 Tehtävä 25 Muuta esimerkkikoodia siten, että ohjelman toiminta on järkevää. Jakaja kysytään alussakin käyttäjältä. Virhekäsittelystä palataan koittamaan jakamista uudella jakajalla. Tutustu tarvittaessa Visual Studion ohjeistukseen. Lisää poikkeustenkäsittelyä omaan harjoitustyöhösi.
37
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi107 Debuggaus Käännettäessä valittavissa kaksi eri tilaa: Debug ja Release. Debuggausvalintoja ja –tiloja voi valita Project Settings –valintaikkunan C/C++ välilehdeltä. Debug-työkalurivi.
38
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi108 Windows-ohjelmointi Windows-ohjelmointi Visual C++:lla koostuu erilaisista vaiheista: Käyttöliittymän rakentaminen. Ohjelmakoodin tuottaminen. Ohjelmakoodin liittäminen käyttöliittymään. MDI/SDI/Dialogipohjainen/… Kevyenä harjoituksena teemme johdetusti seuraavaksi pienen dialogipohjaisen sovelluksen.
39
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi109 Nappi-sovellus Projektin tyypin valitseminen MFC AppWizard(exe), Nappi, dialogi Testiajo Dialogipohjan muuttaminen ResourceView, Dialog, IDD_NAPPI_DIALOG TODO-teksti pois, painamua-nappi tilalle Ohjelmakoodin liittäminen nappiin Oikea hiiren nappi nappulan päällä -> Events BN_CLICKED, Add/Edit MessageBox(”Kiitti, jo helpotti!”); Tutki luotuja tiedostoja
40
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi110 Muuta Aiheita, joita käsitellään, mikäli jää aikaa ja mielenkiintoa riittää: templatet Katsaus funktiokirjastoihin Operaattoreiden ylikuormitus Muodostimet ja tuhoajat perinnässä Ketjutetut listat… ?
Samankaltaiset esitykset
© 2023 SlidePlayer.fi Inc.
All rights reserved.