Luokan otsikko- ja toteutustiedosto tMyn1 Luokan otsikko- ja toteutustiedosto •Tähän asti ohjelmaesimerkit on toteutettu siten, että kaikki koodi on yhdessä.

Slides:



Advertisements
Samankaltaiset esitykset
Koostumussuhde Jukka Juslin © Jukka Juslin.
Advertisements

Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
Luokkien väliset koostesuhteet
Muutamia käsitteitätMyn1 Muutamia käsitteitä •Perintä (inheritance) on luokkien välinen suhde, jossa johdettu luokka (subclass, derived class) perii kantaluokan,
© 2004 Hewlett-Packard Development Company, L.P. The information contained herein is subject to change without notice Java-perusteet Kari Kujansuu
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi71 Olio-ohjelmointi 2. osa: diat (2. välikoe) KYMENLAAKSON AMMATTIKORKEAKOULU Jarkko Ansamäki, 2001.
Jukka Juslin Poikkeukset ja niiden paikallistaminen * Jukka Juslin * Liittyy oppikirjan lukuun 11.
Taulukot: Array Taulukko Javassa pitää aina perustaa (new)
Johdetun luokan määrittely tMyn1 Johdetun luokan määrittely •Kun johdettu luokka periytetään kantaluokasta, saadaan kantaluokan jäsenet enemmän tai vähemmän.
1. Olio-ohjelmointi.
13. Pakkaukset.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Yksinkertaiset graafiset syöttö- ja tulostustoiminnot.
Ohjelman jakaminen useampaan tiedostoon Olio-ohjelmointi (C++) KYAMK, Jarkko Ansamäki 2001.
Olio-ohjelmoinnin perusteet luento 3
Poikkeuskäsittely- lohkot tMyn1 Poikkeuskäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw ja.
Vakio-osoitin ja osoitin vakioon tMyn1 Vakio-osoitin ja osoitin vakioon Tavallinen osoitin voi vaihtaa osoitettavaa keskusmuistialuetta. Tämä voidaan tehdä.
Luokkien löytyminen käytännössä tMyn1 Luokkien löytyminen käytännössä Kun aletaan ratkaista elävän elämän ohjelmointitehtäviä, niin ensimmäisten asioiden.
Osoitin ja char- tietotyyppi tMyn1 Osoitin ja char-tietotyyppi Osoitinmuuttuja, joka on tyyppiä char* voidaan alustaa merkkijonolla: char* alku=”En toivo.
Sami Jantunen LTY/Tietotekniikan osasto
Dynaamiset oliottMyn1 Dynaamiset oliot Dynaamisen olion tunnuksen esittely ja olion määrittely voivat tapahtua yhtäaikaisesti tai eri aikaan. Dynaamisen.
Olioon kohdistuvia perustoimintoja tMyn1 Olioon kohdistuvia perustoimintoja Kopiointimuodostin (copy constructor) alustaa olion tietojäsenet saman luokan.
Virtuaaliset jäsenfunktiot tMyn1 Virtuaaliset jäsenfunktiot Virtuaalinen jäsenfunktio on esiteltävä monimuotoisessa kantaluokassa. Virtuaalisen jäsenfunktion.
Tekstitiedostosta lukeminen tMyn1 Tekstitiedostosta lukeminen Tiedosto voidaan avata pelkästään lukemista varten tai kirjoittamista ja lukemista varten.
Funktion esittely eli prototyyppi tMyn1 Funktion esittely eli prototyyppi Funktion esittely (function declaration) kertoo funktion nimen, parametrien tyypit.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
Luokan muodostintMyn1 Luokan muodostin Olioihin kohdistuvia automaattisia toimintoja ovat luonti, alustus, kopiointi, sijoitus, tyhjennys ja tuhoaminen.
Luokan määrittely class-määreellä tMyn1 Luokan määrittely class-määreellä Luokan määrittely tarkoittaa luokan tietojäsenten esittelyä ja jäsenfunktioiden.
String-vertailusta ja Scannerin käytöstä (1/2)
Lueteltu tyyppitMyn1 Lueteltu tyyppi Lueteltu tyyppi on tietotyyppi, jonka arvot luetellaan erikseen tyypin määrittelyn yhteydessä. Lueteltua tietotyyppiä.
1 DataOutputStream ja DataInputStream DataOutputStream:lla voidaan tallentaa perustietotyyppien arvoja binäärimuotoiseen tiedostoon DataInputStream:lla.
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
5. Kapselointi Yleistä Kapseloinnilla (encapsulation) tarkoitetaan luokan tietojen ja toimintojen pakkaamista yhdeksi suojatuksi kokonaisuudeksi.
10. Abstrakti luokka Johdanto Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Virheenpaljastus- ja korjauskoodit tMyn1 Virheenpaljastus- ja korjauskoodit Virheen havaitseminen Tässä vaaditaan ainoastaan se, että pystytään toteamaan.
Olioon kohdistuvia perustoimintoja tMyn1 Olioon kohdistuvia perustoimintoja Kopiointimuodostin (copy constructor) alustaa olion tietojäsenet saman luokan.
Ohjelman keskeytys virhetilanteessa tMyn1 Ohjelman keskeytys virhetilanteessa Poikkeustilanteet voidaan ryhmitellä logiikkavirheisiin ja muihin ajonaikaisiin.
17. Kooste Kooste Kooste (aggregation) on luokkien A ja B välinen suhde, joka tarkoittaa “A on B:n osa” tai “A kuuluu B:hen”. − Koostesuhteessa.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
Perussyöttö- ja tulostustoiminnot tMyn1 Perussyöttö- ja tulostustoiminnot Kun ohjelmaan sisällytetään otsikkotiedosto iostream, voidaan käyttää cin- ja.
Johdetun luokan olion esittely... tMyn1 Johdetun luokan olion esittely ja määrittely Esittelyluokka tarkoittaa olion tunnuksen luokkaa. Määrittelyluokka.
Oliot ja luokat Oliot ja luokat Oliot (object) ja luokat (class) ovat keskeisiä olio- ohjelmoinnin käsitteitä. Olio-ohjelmointi on ohjelmointiparadigma,
Poikkeustenkäsittely- lohkot tMyn1 Poikkeustenkäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw.
Oman poikkeus- käsittelyfunktion tMyn1 Oman poikkeuskäsittelyfunktion määrittely Funktion tulisi muodostaa ainoastaan sellaisia poikkeuksia, jotka on sallittu.
Olioiden taulukointi Perustaulukon käyttö Luokan ilmentymät voidaan tallettaa taulukkoon samoin kuin muuttujat Esimerkki talletetaan taulukkoon opintojaksojen.
11. Rajapinnat Sisällys Mitä rajapinnat ovat? Kuinka ne määritellään ja otetaan käyttöön? Moniperiytyminen rajapintojen avulla. Varoituksen.
Tekstitiedostoon kirjoittaminen tMyn1 Tekstitiedostoon kirjoittaminen Tiedostoja käsitellään ohjelmassa tiedosto-olion avulla. Tiedosto-olion luokka sisältää.
Ohjelmointi työtä n. 16 h/vko onnistumista työtä n. 16 h/vko onnistumista #include int main(void) { std::cout
Monimuotoinen luokka tMyn1 Monimuotoinen luokka Monimuotoinen luokka mahdollistaa saman jäsenfunktion toteutuksen monella tavalla. Tällöin puhutaan virtuaalisesta.
Tiedon vieminen funktiolle tMyn1 Tiedon vieminen funktiolle, parametrit Argumentin vieminen funktiolle voidaan toteuttaa kahdella menetelmällä: –Pass-by-Value.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
Kantaluokan määrittely tMyn1 Kantaluokan määrittely Perinnän käyttöön liittyvät varatut sanat private, protected, public, final ja abstract. Ne tarkoittavat.
Javan oliovirrat eli oliotiedostojen käsittely. Olio- eli objektitiedostojen käsittely Käsittely täysin samanlaista kuin muiden tiedostojen 1.Otetaan.
Johdetun luokan määrittely tMyn1 Johdetun luokan määrittely Kun johdettu luokka periytetään kantaluokasta, saadaan kantaluokan jäsenet enemmän tai vähemmän.
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
Olio-ohjelmoinnin perusteet luento 5 Päivi Ovaska LTY/Tietotekniikan osasto.
5. Kapselointi.
11. Rajapinnat.
Poikkeustenkäsittelylohkot try-catch
1. Olio-ohjelmointi.
Kantaluokan määrittely
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
Kantaluokan määrittely
14. Hyvä ohjelmointitapa.
13. Pakkaukset.
Tiedon tulostaminen/kirjoittaminen ”WriteLine”
13. Pakkaukset.
4. Luokan testaus ja käyttö olion kautta
eli oliotiedostojen käsittely
Esityksen transkriptio:

Luokan otsikko- ja toteutustiedosto tMyn1 Luokan otsikko- ja toteutustiedosto •Tähän asti ohjelmaesimerkit on toteutettu siten, että kaikki koodi on yhdessä lähdetiedostossa. •Yhtä hyvin – ja luultavammin jopa paremmin/selkeämmin – voidaan toimia siten, että kutakin toteutettavaa luokkaa kohden syntyy kaksi tiedostoa: luokan otsikkotiedosto ja luokan jäsenfunktioiden toteutustiedosto. •Otsikkotiedosto (the class specification file) on tyypillisesti saman niminen kuin toteutettava luokka, ja tämän tiedoston tarkenneosana on.h. Siis jos luokan nimi on Suorakaide, niin otsikkotiedostona on Suorakaide.h.

Luokan otsikko- ja toteutustiedosto tMyn2 •Luokan jäsenfunktioiden toteutustiedosto (the class implementation file) on tyypillisesti saman niminen kuin toteutettava luokka, ja tämän tiedoston tarkenneosana on.cpp. Siis jos luokan nimi on Suorakaide, niin toteutustiedostona on Suorakaide.cpp. •Lähdetään liikkeelle ohjelmasta, jossa kaikki on toteutettu yhteen lähdekooditiedostoon:

Luokan otsikko- ja toteutustiedosto tMyn3 #include "stdafx.h" #include using namespace System; using namespace std; class Suorakaide { public: Suorakaide(double, double); void AsetaLeveys(double); void AsetaKorkeus(double); double HaeLeveys() const; double HaeKorkeus() const; double HaeAla() const; private: double m_leveys; double m_korkeus; };

Luokan otsikko- ja toteutustiedosto tMyn4 Suorakaide::Suorakaide(double leveys, double korkeus) { cout<<"Oletusmuodostin, olio "<<this<<endl; AsetaLeveys(leveys); AsetaKorkeus(korkeus); } void Suorakaide::AsetaLeveys(double leveys) { m_leveys=leveys; } void Suorakaide::AsetaKorkeus(double korkeus) { m_korkeus=korkeus; } double Suorakaide::HaeLeveys() const { return m_leveys; }

Luokan otsikko- ja toteutustiedosto tMyn5 double Suorakaide::HaeKorkeus() const { return m_korkeus; } double Suorakaide::HaeAla() const { return m_leveys*m_korkeus; }

Luokan otsikko- ja toteutustiedosto tMyn6 int main(array ^args) { Suorakaide eka=Suorakaide(5.14, 8.28); cout<<"Ala on "<<eka.HaeAla()<<" pa-yksikk\224\204."<<endl; eka.AsetaKorkeus(12.92); cout<<"Ala on "<<eka.HaeAla()<<" pa-yksikk\224\204."<<endl; return 0; }

Luokan otsikko- ja toteutustiedosto tMyn7 •Toteutetaan edellinen ohjelma siten, että muodostetaan Visual Studiolla projekti, jossa on erikseen tiedostot Suorakaide.h (luokan otsikkotiedosto), Suorakaide.cpp (luokan jäsenfunktioiden toteutustiedosto) ja SuorakaideMain.cpp (lähdetiedosto, joka käyttää luokkaa ja jossa on main-osa). Tuon viimeisen lähdekooditiedoston nimi olisi voinut olla main.cpp, mutta siinä tapauksessa hakemisto (jossa on kaikki omat projektit) voisi olla jonkin ajan kuluttua aika epähavainnollinen. •Aluksi luodaan projekti SuorakaideMain.

Luokan otsikko- ja toteutustiedosto tMyn8 •Lisätään ensimmäiseksi projektiin otsikkotiedosto Suorakaide.h. •Project -> Add New Item…

Luokan otsikko- ja toteutustiedosto tMyn9 •Luokan otsikkotiedosto saattaa esiintyä samassa käännösyksikössä #include-komennon yhteydessä useaan kertaan. •Tällainen aiheuttaa saman luokan määrittelyn monta kertaa samassa käännösyksikössä. •Saman tunnuksen voi esitellä monta kertaa, mutta määritellä vain kerran yhdessä käännösyksikössä. •Käännösvirheet voidaan estää esikäsittelijän direktiivillä (preprocessor directive) #ifndef (if not defined). •Kunkin luokan määrittelylle annetaan yksilöllinen tunniste (identifier) #define direktiivillä.

Luokan otsikko- ja toteutustiedosto tMyn10 •Esikäsittelijä tutkii onko määrittely jo sisällytetty käännettyyn koodiin. •Jos ei ole, niin esikäsittelijä sisällyttää määrittelyn. •Määrittelyn loppuun on kirjoitettava #endif. •Siis: #ifndef identifier #define identifier //Luokan määärittely #endif •identifier muodostetaan yleensä luokan otsikkotiedoston nimestä, seuraavaksi Suorakaide.h:

Luokan otsikko- ja toteutustiedosto tMyn11 #ifndef SUORAKAIDE_H #define SUORAKAIDE_H class Suorakaide { public: Suorakaide(double, double); void AsetaLeveys(double); void AsetaKorkeus(double); double HaeLeveys() const; double HaeKorkeus() const; double HaeAla() const; private: double m_leveys; double m_korkeus; }; #endif Ei tarvita liittää mitään otsikkotiedostoja, koska luokan määrittelyssä ei viitata mihinkään käyttäjän määrittelemään luokkaan eikä otsikkotiedosto sisällä suoritettavia lauseita. HUOM! Tilanne hieman muuttuu, jos tietojäsenen tyyppinä on string tai tai string*!!

Luokan otsikko- ja toteutustiedosto tMyn12 •Seuraavaksi lisätään luokan jäsenfunktioiden toteutustiedosto Suorakaide.cpp •Project -> Add New Item…

Luokan otsikko- ja toteutustiedosto tMyn13 •Kun edellä toteutettua otsikkotiedostoa halutaan käyttää tässä luokan jäsenfunktioiden toteutustiedostossa, sisällytetään ohjelmakoodiin #include-komento, joka on esikäsittelijälle komento sisällyttää toisen tiedoston sisältö käännettävään ohjelmakoodiin: #include ”Suorakaide.h” •Itse kirjoitettujen luokkien otsikkotiedostojen nimet kirjoitetaan #include-komennon yhteydessä lainausmerkkien väliin, kun taas kääntäjän omat otsikkotiedostojen nimet kirjoitetaan <>-merkkien väliin totuttuun tapaan.

Luokan otsikko- ja toteutustiedosto tMyn14 •Edellä kuvattu merkintätapa nopeuttaa esikäsittelijän työtä sisällytettävien tiedostojen etsinnässä. •Esikäsittelijä etsii kääntäjä omia otsikkotiedostoja kääntäjän omista hakemistoista, kun taas ohjelmoijan kirjoittamia otsikkotiedostoja esikäsittelijä etsii edeten työhakemistosta käsin kohti kääntäjän omia hakemistoja. •Seuraavaksi luokan jäsenfunktioiden toteutustiedosto Suorakaide.cpp:

Luokan otsikko- ja toteutustiedosto tMyn15 #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; Suorakaide::Suorakaide(double leveys, double korkeus) { cout<<"Oletusmuodostin, olio "<<this<<endl; AsetaLeveys(leveys); AsetaKorkeus(korkeus); } Suorakaide.cpp sisältää suoritettavia lauseita. Tällöin ohjelmakoodiin on sisällytettävä ne kääntäjän otsikkotiedostot, joita suoritettavissa lauseissa tarvitaan. Myös luokan otsikkotiedosto (Suorakaide.h) on mukana, jotta jäsenfunktioissa voitaisiin käyttää luokan tietojäsenten ja jäsenfunktioiden tunnuksia.

Luokan otsikko- ja toteutustiedosto tMyn16 void Suorakaide::AsetaLeveys(double leveys) { m_leveys=leveys; } void Suorakaide::AsetaKorkeus(double korkeus) { m_korkeus=korkeus; } double Suorakaide::HaeLeveys() const { return m_leveys; } double Suorakaide::HaeKorkeus() const { return m_korkeus; } double Suorakaide::HaeAla() const { return m_leveys*m_korkeus; }

Luokan otsikko- ja toteutustiedosto tMyn17 •Viimeiseksi kirjoitetaan pääohjelma SuorakaideMain.cpp. •Koska ohjelma viittaa Suorakaide-luokkaan ja sen jäsenfunktioiden tunnuksiin, on myös Suorakaide-luokan otsikkotiedosto sisällytettävä mukaan. •Huomaa, että sisällytettävä tiedosto on otsikkotiedosto, ei luokan jäsenfunktioiden toteutustiedosto. Käännösvaiheessa riittää, että tunnusten nimien esittely löytyy lähdetekstistä ennen viittauskohtaa:

Luokan otsikko- ja toteutustiedosto tMyn18 #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; int main(array ^args) { Suorakaide eka=Suorakaide(5.14, 8.28); cout<<"Ala on "<<eka.HaeAla()<<" pa-yksikk\224\204."<<endl; eka.AsetaKorkeus(12.92); cout<<"Ala on "<<eka.HaeAla()<<" pa-yksikk\224\204."<<endl; return 0; }

Luokan otsikko- ja toteutustiedosto tMyn19 Suorakaide.cppSuorakaide.hSuorakaideMain.cpp Suorakaide.obj C++ standard library object code SuorakaideMain.obj linker compiler SuorakaideMain.exe

Luokan otsikko- ja toteutustiedosto tMyn20 •Seuraavassa esimerkissä on luokkarakenne, jossa on kolmikerroksinen hierarkia, tässä aluksi yhtenä lähdekooditiedostona (Huom! Tämä esimerkki käsitellään sen jälkeen kun on käsitelty perintä ja monimuotoisuus):

Luokan otsikko- ja toteutustiedosto tMyn21 #include "stdafx.h" #include using namespace System; using namespace std; class Elokuva { public: Elokuva(); void AsetaElokuvanNimi(); virtual ~Elokuva(); virtual void HaeTiedot(); protected: string* mp_elokuvannimi; };

Luokan otsikko- ja toteutustiedosto tMyn22 Elokuva::Elokuva() { cout<<"Elokuva-oletusmuodostin, olio "<<this<<endl; mp_elokuvannimi=new string; AsetaElokuvanNimi(); } void Elokuva::AsetaElokuvanNimi() { cout<<"Anna elokuvan nimi: "; getline(cin, *mp_elokuvannimi); } void Elokuva::HaeTiedot() { cout<<"Elokuvan nimi on "<<*mp_elokuvannimi<<"."<<endl; } Elokuva::~Elokuva() { cout<<"Elokuva-hajotin, olio "<<this<<endl; delete mp_elokuvannimi; }

Luokan otsikko- ja toteutustiedosto tMyn23 class Nayttelija: public Elokuva { public: Nayttelija(); void AsetaNayttelijanNimi(); virtual ~Nayttelija(); virtual void HaeTiedot(); protected: string* mp_nayttelijannimi; }; Nayttelija::Nayttelija() { cout<<"Nayttelija-oletusmuodostin, olio "<<this<<endl; mp_nayttelijannimi=new string; AsetaNayttelijanNimi(); }

Luokan otsikko- ja toteutustiedosto tMyn24 void Nayttelija::AsetaNayttelijanNimi() { cout<<"Anna n\204yttelij\204n nimi: "; getline(cin, *mp_nayttelijannimi); } void Nayttelija::HaeTiedot() { cout<<"Elokuvan nimi on "<<*mp_elokuvannimi<<"."<<endl; cout<<"N\204yttelij\204 nimi on "<<*mp_nayttelijannimi<<"."<<endl; } Nayttelija::~Nayttelija() { cout<<"Nayttelija-hajotin, olio "<<this<<endl; delete mp_nayttelijannimi; }

Luokan otsikko- ja toteutustiedosto tMyn25 class Rooli: public Nayttelija { public: Rooli(); void AsetaRooliNimi(); virtual ~Rooli(); virtual void HaeTiedot(); private: string* mp_roolinimi; }; Rooli::Rooli() { cout<<"Rooli-oletusmuodostin, olio "<<this<<endl; mp_roolinimi=new string; AsetaRooliNimi(); }

Luokan otsikko- ja toteutustiedosto tMyn26 void Rooli::AsetaRooliNimi() { cout<<"Anna roolin nimi: "; getline(cin, *mp_roolinimi); } void Rooli::HaeTiedot() { cout<<"Elokuvan nimi on "<<*mp_elokuvannimi<<"."<<endl; cout<<"N\204yttelij\204 nimi on "<<*mp_nayttelijannimi<<"."<<endl; cout<<"Roolinimen\204 on "<<*mp_roolinimi<<"."<<endl; } Rooli::~Rooli() { cout<<"Rooli-hajotin, olio "<<this<<endl; delete mp_roolinimi; }

Luokan otsikko- ja toteutustiedosto tMyn27 int main(array ^args) { Elokuva* eka=new Rooli(); Elokuva* toka=new Nayttelija(); Elokuva* kolmas=new Elokuva(); Elokuva* osoitin=eka; osoitin->HaeTiedot(); osoitin=toka; osoitin->HaeTiedot(); osoitin=kolmas; osoitin->HaeTiedot(); delete eka; delete toka; delete kolmas; return 0; }

Luokan otsikko- ja toteutustiedosto tMyn28

Luokan otsikko- ja toteutustiedosto tMyn29 •Rakennetaan projekti ammattimaisemman näköiseksi. Kullakin luokalla on nyt oma otsikkotiedostonsa ja kunkin luokan jäsenfunktioille on oma toteutustiedostonsa:

Luokan otsikko- ja toteutustiedosto tMyn30 // Elokuva.h otsikkotiedosto #ifndef ELOKUVA_H #define ELOKUVA_H using namespace std; class Elokuva { public: Elokuva(); void AsetaElokuvanNimi(); virtual ~Elokuva(); virtual void HaeTiedot(); protected: string* mp_elokuvannimi; }; #endif Tietojäsenen tyyppinä on string*, silloin tarvitaan tämä lisäys.

Luokan otsikko- ja toteutustiedosto tMyn31 // Nayttelija.h otsikkotiedosto #ifndef NAYTTELIJA_H #define NAYTTELIJA_H #include "Elokuva.h” using namespace std; class Nayttelija: public Elokuva { public: Nayttelija(); void AsetaNayttelijanNimi(); virtual ~Nayttelija(); virtual void HaeTiedot(); protected: string* mp_nayttelijannimi; }; #endif

Luokan otsikko- ja toteutustiedosto tMyn32 // Rooli.h otsikkotiedosto #ifndef ROOLI_H #define ROOLI_H #include "Nayttelija.h” using namespace std; class Rooli: public Nayttelija { public: Rooli(); void AsetaRooliNimi(); virtual ~Rooli(); virtual void HaeTiedot(); private: string* mp_roolinimi; }; #endif

Luokan otsikko- ja toteutustiedosto tMyn33 // Elokuva.cpp toteutustiedosto #include "stdafx.h" #include #include "Elokuva.h" using namespace System; using namespace std; Elokuva::Elokuva() { cout<<"Elokuva-oletusmuodostin, olio "<<this<<endl; mp_elokuvannimi=new string; AsetaElokuvanNimi(); }

Luokan otsikko- ja toteutustiedosto tMyn34 void Elokuva::AsetaElokuvanNimi() { cout<<"Anna elokuvan nimi: "; getline(cin, *mp_elokuvannimi); } void Elokuva::HaeTiedot() { cout<<"Elokuvan nimi on "<<*mp_elokuvannimi<<"."<<endl; } Elokuva::~Elokuva() { cout<<"Elokuva-hajotin, olio "<<this<<endl; delete mp_elokuvannimi; }

Luokan otsikko- ja toteutustiedosto tMyn35 // Nayttelija.cpp toteutustiedosto #include "stdafx.h" #include #include "Nayttelija.h” using namespace System; using namespace std; Nayttelija::Nayttelija() { cout<<"Nayttelija-oletusmuodostin, olio "<<this<<endl; mp_nayttelijannimi=new string; AsetaNayttelijanNimi(); }

Luokan otsikko- ja toteutustiedosto tMyn36 void Nayttelija::AsetaNayttelijanNimi() { cout<<"Anna n\204yttelij\204n nimi: "; getline(cin, *mp_nayttelijannimi); } void Nayttelija::HaeTiedot() { cout<<"Elokuvan nimi on "<<*mp_elokuvannimi<<"."<<endl; cout<<"N\204yttelij\204n nimi on "<<*mp_nayttelijannimi <<"."<<endl; } Nayttelija::~Nayttelija() { cout<<"Nayttelija-hajotin, olio "<<this<<endl; delete mp_nayttelijannimi; }

Luokan otsikko- ja toteutustiedosto tMyn37 // Rooli.cpp toteutustiedosto #include "stdafx.h" #include #include "Rooli.h” using namespace System; using namespace std; Rooli::Rooli() { cout<<"Rooli-oletusmuodostin, olio "<<this<<endl; mp_roolinimi=new string; AsetaRooliNimi(); } void Rooli::AsetaRooliNimi() { cout<<"Anna roolin nimi: "; getline(cin, *mp_roolinimi); }

Luokan otsikko- ja toteutustiedosto tMyn38 void Rooli::HaeTiedot() { cout<<"Elokuvan nimi on "<<*mp_elokuvannimi<<"."<<endl; cout<<"N\204yttelij\204n nimi on "<<*mp_nayttelijannimi <<"."<<endl; cout<<"Roolinimen\204 on "<<*mp_roolinimi<<"."<<endl; } Rooli::~Rooli() { cout<<"Rooli-hajotin, olio "<<this<<endl; delete mp_roolinimi; }

Luokan otsikko- ja toteutustiedosto tMyn39 // MattDamonSepMain.cpp : main project file. #include "stdafx.h" #include #include "Rooli.h" using namespace System; using namespace std; int main(array ^args) { Elokuva* eka=new Rooli(); Elokuva* toka=new Nayttelija(); Elokuva* kolmas=new Elokuva();

Luokan otsikko- ja toteutustiedosto tMyn40 Elokuva* osoitin=eka; osoitin->HaeTiedot(); osoitin=toka; osoitin->HaeTiedot(); osoitin=kolmas; osoitin->HaeTiedot(); delete eka; delete toka; delete kolmas; return 0; }