40
Syksy 2001 KYAMK/J.Ansamäki/Olio-ohj elmointi 1 Olio-ohjelmointi 2. osa: diat 71-110 (2. välikoe) KYMENLAAKSON AMMATTIKORKEAKOULU Jarkko Ansamäki, 2001

Olio-ohjelmointi 2. osa: diat 71-110 (2. välikoe)

  • Upload
    didina

  • View
    55

  • Download
    0

Embed Size (px)

DESCRIPTION

Olio-ohjelmointi 2. osa: diat 71-110 (2. välikoe). KYMENLAAKSON AMMATTIKORKEAKOULU Jarkko Ansamäki, 2001. Läpikäytävät asiat. Olioiden kommunikaatio Perintä ja olion koostuminen osaolioista Tiedostojen käsittely Virheiden käsittely Debuggaus Nopea tutustuminen Windows-ohjelmointiin. - PowerPoint PPT Presentation

Citation preview

Page 1: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

1

Olio-ohjelmointi2. osa: diat 71-110 (2. välikoe)

KYMENLAAKSON AMMATTIKORKEAKOULUJarkko Ansamäki, 2001

Page 2: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

2

Läpikäytävät asiatOlioiden kommunikaatioPerintä ja olion koostuminen osaolioistaTiedostojen käsittelyVirheiden käsittelyDebuggausNopea tutustuminen Windows-

ohjelmointiin.Muuta?

Page 3: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

3

Olioiden kommunikaatioViesti = 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.

Page 4: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

4

this-osoitinOsoitin on C++ kielessä valmiiksi

esitelty: Luokan_nimi *const this;

Osoitin pitää sisällään kutsutun olion muistiosoitteen. void Luokka::Tulostus2(){ cout<<”Traa: ”; this->Tulostus1(); }

Page 5: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

5

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.

Page 6: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

6

Tehtävä 16Toteuta 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”; }

Page 7: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

7

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).

Page 8: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

8

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.

Page 9: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

9

Tehtävä 17Lisää 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.

Page 10: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

10

Tehtävä 18Lisää 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.

Page 11: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

11

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ä.

Page 12: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

12

Esimerkki perinnästä #include <iostream.h> 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();

}

Page 13: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

13

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.

Page 14: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

14

Tehtävä 19Periytä 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.

Page 15: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

15

Virtuaalifunktiotvirtual-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.

Page 16: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

16

Esimerkkikoodi #include <iostream.h> 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<<"="<<lauseke->Arvo(); }

Page 17: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

17

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.

Page 18: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

18

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){…}

Page 19: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

19

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.

Page 20: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

20

Tehtävä 20Lisää äsken esiteltyyn esimerkkikoodiin

luokat vähennys-, kerto- ja jakolaskua varten.

Testaa luokkien toiminta.

Page 21: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

21

(epäpuhtaat) virtuaalifunktiotMuillekin, 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.

Page 22: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

22

Esimerkkikoodi #include <iostream.h>

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();

}

Page 23: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

23

protected-näkyvyysalueprotected: -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.

Page 24: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

24

Tehtävä 21Lisää 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?

Page 25: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

25

Osista kokonaisuusToinen 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ä.

Page 26: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

26

#include <iostream.h> class Osa{

char nimi[20]; public:

Osa(){ cout<<"Anna osan nimi: "; cin>>nimi; } char *Palauta(){return nimi;}

}; class Kokonaisuus{

Osa eka, toka; char nimi[20];

public: Kokonaisuus(){ cout<<"Anna kokonaisuuden nimi: "; cin>>nimi; } void Tulostus();

}; void Kokonaisuus::Tulostus(){

cout<<nimi<<":\n"<<eka.Palauta()<<endl<<toka.Palauta()<<endl<<endl; } void main(){

Kokonaisuus juttu; juttu.Tulostus();

}

Page 27: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

27

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.

Page 28: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

28

Tehtävä 22Tee 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.

Page 29: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

29

Tiedostojen käsittelyTällä kurssilla käsitellään kahta eri

keinoa tiedostojen käsittelyyn: fstream-kirjastoa:

http://www.kyamk.fi/~zjaan/kurssit/o-o/tiedostot/siframes.htm

MFC-kirjastoista löytyvää Cfile-luokkaa.

Page 30: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

30

Tehtävä 23Tutustu 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.

Page 31: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

31

EsimerkkiongelmaToteutetaan ohjelma, jonka avulla

voidaan kirjoittaa muutama rivi tekstiä tiedostoon tai lukea olemassa oleva tiedosto ja tulostaa tiedoston sisältö näytölle.

Page 32: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

32

Tehtävä 24Mietitään yhdessä, miten

puhelinmuistioiden levytallennukset kannattaisi toteuttaa.

Page 33: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

33

Virheiden käsittelyAjonaikaisia 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ö.

Page 34: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

34

Esimerkkikoodi #include <iostream.h> 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"; }

}

Page 35: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

35

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.

Page 36: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

36

Tehtävä 25Muuta 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.

Page 37: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

37

DebuggausKäännettäessä valittavissa kaksi eri

tilaa: Debug ja Release.Debuggausvalintoja ja –tiloja voi valita

Project Settings –valintaikkunan C/C++ välilehdeltä.

Debug-työkalurivi.

Page 38: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

38

Windows-ohjelmointiWindows-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.

Page 39: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

39

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

Page 40: Olio-ohjelmointi 2. osa: diat 71-110  (2. välikoe)

Syksy 2001 KYAMK/J.Ansamäki/Olio-ohjelmointi

40

MuutaAiheita, joita käsitellään, mikäli jää aikaa

ja mielenkiintoa riittää: templatet Katsaus funktiokirjastoihin Operaattoreiden ylikuormitus Muodostimet ja tuhoajat perinnässä Ketjutetut listat… ?