Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

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

Samankaltaiset esitykset


Esitys aiheesta: "Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi71 Olio-ohjelmointi 2. osa: diat 71-110 (2. välikoe) KYMENLAAKSON AMMATTIKORKEAKOULU Jarkko Ansamäki, 2001."— Esityksen transkriptio:

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…  ?


Lataa ppt "Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi71 Olio-ohjelmointi 2. osa: diat 71-110 (2. välikoe) KYMENLAAKSON AMMATTIKORKEAKOULU Jarkko Ansamäki, 2001."

Samankaltaiset esitykset


Iklan oleh Google