Dynaamiset oliottMyn1 Dynaamiset oliot Dynaamisen olion tunnuksen esittely ja olion määrittely voivat tapahtua yhtäaikaisesti tai eri aikaan. Dynaamisen.

Slides:



Advertisements
Samankaltaiset esitykset
Minimaalinen Java-ohjelma •Kaikki ohjelmakoodi on luokkamäärityksen sisällä •Ohjelma käynnistyy ”public static void main(String[] args)”-metodista •System.out.print()
Advertisements

Koostumussuhde Jukka Juslin © Jukka Juslin.
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
6. Metodit.
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
Luokkien väliset koostesuhteet
Luokan otsikko- ja toteutustiedosto tMyn1 Luokan otsikko- ja toteutustiedosto •Tähän asti ohjelmaesimerkit on toteutettu siten, että kaikki koodi on yhdessä.
Luokkakaaviot Luokkakaaviot Tekninen suunnittelu.
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi71 Olio-ohjelmointi 2. osa: diat (2. välikoe) KYMENLAAKSON AMMATTIKORKEAKOULU Jarkko Ansamäki, 2001.
Taulukot: Array Taulukko Javassa pitää aina perustaa (new)
Rakenteinen ohjelmointi
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.
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Ohjelman jakaminen useampaan tiedostoon Olio-ohjelmointi (C++) KYAMK, Jarkko Ansamäki 2001.
Olio-ohjelmoinnin perusteet luento 3
OLIO-OHJELMOINTI PERUSTEET PERUSTIETOTYYPIT
Poikkeuskäsittely- lohkot tMyn1 Poikkeuskäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw ja.
Luokan muodostintMyn1 Luokan muodostin Olioihin kohdistuvia automaattisia toimintoja ovat luonti, alustus, kopiointi, sijoitus, tyhjennys ja tuhoaminen.
Vakio-osoitin ja osoitin vakioon tMyn1 Vakio-osoitin ja osoitin vakioon Tavallinen osoitin voi vaihtaa osoitettavaa keskusmuistialuetta. Tämä voidaan tehdä.
9. Periytyminen Javassa.
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
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.
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.
7. Oliot ja viitteet.
Luokan määrittely class-määreellä tMyn1 Luokan määrittely class-määreellä Luokan määrittely tarkoittaa luokan tietojäsenten esittelyä ja jäsenfunktioiden.
19. Olio-ohjelmointia Javalla
Lueteltu tyyppitMyn1 Lueteltu tyyppi Lueteltu tyyppi on tietotyyppi, jonka arvot luetellaan erikseen tyypin määrittelyn yhteydessä. Lueteltua tietotyyppiä.
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
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.
Olioon kohdistuvia perustoimintoja tMyn1 Olioon kohdistuvia perustoimintoja Kopiointimuodostin (copy constructor) alustaa olion tietojäsenet saman luokan.
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ä.
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,
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.
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.
Ohjelmistojen mallintaminen, sekvenssikaaviot
Osoittimen määrittely ja alustus tMyn1 Osoittimen määrittely ja alustus Osoitin (pointer) on muuttuja, joka voi sisältää keskusmuistiosoitteen. Osoitinmuuttujan.
Olio ohjelmoinnin perusteet luento 3: Johdanto C++ kieleen, Ensimmäinen C++ ohjelma, Olioiden elinkaari Jani Rönkkönen LTY/Tietotekniikan osasto Kalvot.
Olio-ohjelmoinnin perusteet luento 5 Päivi Ovaska LTY/Tietotekniikan osasto.
Olio-ohjelmoinnin perusteet luento 2
Olio-ohjelmoinista lyhyesti. 2.2 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen.
Yksikkötestaus ● Yksikkötestauksella tarkoitetaan lähdekoodiin kuuluvien yksittäisten osien testaamista. Termi yksikkö viittaa ohjelman pienimpiin mahdollisiin.
3. Olio-ohjelmoinista lyhyesti
1. Olio-ohjelmointi.
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
Kantaluokan määrittely
Luokan määrittely class-määreellä
6. Metodit.
7. Oliot ja viitteet.
4. Attribuutit.
Ohjelmistotekniikan menetelmät, sekvenssikaaviot
Tiedon tulostaminen/kirjoittaminen ”WriteLine”
3. Attribuutit.
4. Luokan testaus ja käyttö olion kautta
eli oliotiedostojen käsittely
Esityksen transkriptio:

Dynaamiset oliottMyn1 Dynaamiset oliot Dynaamisen olion tunnuksen esittely ja olion määrittely voivat tapahtua yhtäaikaisesti tai eri aikaan. Dynaamisen olion tunnuksen esittely on osoitinmuuttujan esittely. Sama osoitinmuuttuja voi osoittaa eri hetkinä eri olioihin ja samaan olioon voi olla useita osoittimia yhtä aikaa.

Dynaamiset oliottMyn2 Dynaamisen olion esittely ja määrittely: luokanNimi *olionTunnus; olionTunnus=new luokanNimi; olionTunnus=new luokanNimi(); Ensimmäisellä rivillä on osoitinmuuttujan esittely. Osoitin voi sisältää myöhemmin varattavan olion keskusmuistiosoitteen. Varsinainen olion tilanvaraus tapahtuu toisella rivillä new-operaattorilla. Kolmannella rivillä kutsutaan itse tehtyä oletusmuodostinta.

Dynaamiset oliottMyn3 Dynaamisen olion esittely ja määrittely yhtaikaisesti: luokanNimi *olionTunnus=new luokanNimi; luokanNimi *olionTunnus=new luokanNimi(); Dynaamisten olioiden tilanvaraus ei häviä automaattisesti, vaan ohjelmoijan on vapautettava tila kutsumalla delete-operaattoria. Pelkkä delete- operaattorin kutsu riittää, jos new-operaattorilla luodulla oliolla on vain automaattisia tietojäseniä. delete olionTunnus;

Dynaamiset oliottMyn4 Jos dynaamisella oliolla olisi myös new-operaattorilla luotuja tietojäseniä, niin silloin luokkaan tarvitaan myös itse toteutettu hajotin. Jos tuota delete-operaattoria ei kutsuta ja jos dynaamisesti luodulla oliolla (siis oliolla, joka oli luotu new-operaattorilla) olisi dynaamisesti luotuja tietojäseniä, niin silloin näiden tietojäsenten vapauttamiseen tehtyä hajotintakaan ei tulisi kutsuttua:

Dynaamiset oliottMyn5 #include "stdafx.h" #include using namespace System; using namespace std; class A { public: A(); A(int); ~A(); void annaArvo(); void annaArvo(int); void tulostaArvo(); private: int* x; };

Dynaamiset oliottMyn6 A::A() { cout<<"Oletusmuodostin, olio "<<this<<endl; x=new int; annaArvo(); } A::A(int uusiArv) { cout<<"Parametrillinen muodostin, olio "<<this<<endl; x=new int; annaArvo(uusiArv); } A::~A() { cout<<"Hajotin, olio "<<this<<endl; delete x; }

Dynaamiset oliottMyn7 void A::annaArvo() { cout<<"Anna arvo: "; cin>>*x; } void A::annaArvo(int noSeUusi) { *x=noSeUusi; } void A::tulostaArvo() { cout<<"Tietoj\204senen arvo on "<<*x<<", olio "<<this<<endl; };

Dynaamiset oliottMyn8 int main(array ^args) { A* ekaDynOlio=new A(); ekaDynOlio->tulostaArvo(); A* tokaDynOlio=new A(44); tokaDynOlio->tulostaArvo(); delete ekaDynOlio; return 0; }

Dynaamiset oliottMyn9 Dynaamisen olion tilanvaraus ja kopiointimuodostimen kutsu: Luokka* uusiDynOlio; uusiDynOlio=new Luokka(vanhaAutomOlio); uusiDynOlio=new Luokka(*vanhaDynOlio); Ensimmäisellä rivillä on pelkkä osoitinmuuttujan esittely. Toisella rivillä vanhaAutomOlio on automaattinen ja kolmannella rivillä vanhaDynOlio on dynaaminen – niin kuin nimet yrittävät ehdottaakin.

Dynaamiset oliottMyn10 Dynaaminen tietojäsen tarkoittaa tietojäsentä, jolle varattavan muistitilan koko vaihtelee oliokohtaisesti. Dynaaminen tietojäsen toteutetaan osoittimen ja dynaamisen muistinvarauksen avulla. Dynaamiselle tietojäsenelle on varattava tila new- operaattorilla ja sen varaama tila on vapautettava delete-operaattorilla. Tilanvaraus tehdään olion alustuksen yhteydessä muodostimessa ja tilanvapautus on tehtävä olion tilanvapautuksen yhteydessä hajottimessa.

Dynaamiset oliottMyn11 Dynaamisten tietojäsenten varaamat tilat eivät vapaudu automaattisesti olion tuhoamisen yhteydessä. Jos olio tuhotaan dynaamisten tietojäsenten tilaa vapauttamatta, jäävät tietojäsenet keskusmuistiin, vaikka niihin ei enää olisi käytössä olevaa osoitinta. Dynaamisia tietojäseniä voi olla kaikilla olioilla riippumatta olion tunnuksen muistinvarausluokasta!

Dynaamiset oliottMyn12 Seuraavassa esimerkissä tehdään kopiointimuodostin ja todetaan sen toimivuus sellaisen dynaamisen olion yhteydessä jolla on dynaaminen tietojäsen. Sekä alkuperäinen että kopioinnin avulla luotava olio ovat siis dynaamisia:

Dynaamiset oliottMyn13 #include "stdafx.h" #include using namespace System; using namespace std; class A { public: A(); A(int); A(const A&); ~A(); void annaArvo(); void annaArvo(int); void tulostaArvo(); private: int* x; };

Dynaamiset oliottMyn14 A::A() { cout<<"Oletusmuodostin, olio "<<this<<endl; x=new int; annaArvo(); } A::A(int uusiArv) { cout<<"Parametrillinen muodostin, olio "<<this<<endl; x=new int; annaArvo(uusiArv); } A::A(const A& viittaus) { cout<<"Kopiointimuodostin, olio "<<this<<endl; x=new int; *x=*(viittaus.x); }

Dynaamiset oliottMyn15 A::~A() { cout<<"Hajotin, olio "<<this<<endl; delete x; } void A::annaArvo() { cout<<"Anna arvo: "; cin>>*x; } void A::annaArvo(int noSeUusi) { *x=noSeUusi; } void A::tulostaArvo() { cout<<"Tietoj\204senen arvo on "<<*x<<", olio "<<this<<endl; };

Dynaamiset oliottMyn16 int main(array ^args) { A* ekaDynAlkup=new A(); cout<<"Alkuper\204isen olion tietoj\204senen arvo alussa:"<<endl; ekaDynAlkup->tulostaArvo(); A* ekaDynKopio=new A(*ekaDynAlkup); ekaDynKopio->tulostaArvo(); cout<<"Halutaan tehd\204 muutos vain kopioidun olion \ tietoj\204senelle:"<<endl; ekaDynKopio->annaArvo(1957); cout<<"Kopioidun olion tietoj\204senen uusi arvo:"<<endl; ekaDynKopio->tulostaArvo(); cout<<"Alkuper\204isen olion tietoj\204senen arvo lopuksi:"<<endl; ekaDynAlkup->tulostaArvo(); delete ekaDynAlkup; delete ekaDynKopio; return 0; }

Dynaamiset oliottMyn17

Dynaamiset oliottMyn18 Aiemmissa esimerkeissä on tietojäsenen tyyppinä ollut usein int. Monipuolistetaan esimerkkivalikoimaa ottamalla mukaan string-tyyppinen tietojäsen. Käytetään esimerkissä myös itse tehtyä kopiointimuodostinta:

Dynaamiset oliottMyn19 #include "stdafx.h" #include using namespace System; using namespace std; class Opiskelija { private: int vuosikurssi; string* nimi; string* puhNumero; public: Opiskelija(); Opiskelija(int, string, string); Opiskelija(const Opiskelija&); ~Opiskelija();

Dynaamiset oliottMyn20 void annaVuosikurssi(); void annaNimi(); void annaPuhNro(); void annaVuosikurssi(int); void annaNimi(string); void annaPuhNro(string); void naytaTiedot(); }; Opiskelija::Opiskelija() { cout<<"Oletusmuodostin, olio "<<this<<endl; annaVuosikurssi(); nimi=new string; annaNimi(); puhNumero=new string; annaPuhNro(); }

Dynaamiset oliottMyn21 void Opiskelija::annaVuosikurssi() { cout<<"Anna vuosikurssi: "; cin>>vuosikurssi; cin.get(); } void Opiskelija::annaNimi() { cout<<"Anna nimi: "; getline(cin, *nimi); } void Opiskelija::annaPuhNro() { cout<<"Anna puhNumero: "; getline(cin, *puhNumero); }

Dynaamiset oliottMyn22 Opiskelija::Opiskelija(int eka, string toka, string kolmas) { cout<<"Parametrillinen muodostin, olio "<<this<<endl; annaVuosikurssi(eka); nimi=new string; annaNimi(toka); puhNumero=new string; annaPuhNro(kolmas); } void Opiskelija::annaVuosikurssi(int kokLuku) { vuosikurssi=kokLuku; } void Opiskelija::annaNimi(string seNimi) { *nimi=seNimi; }

Dynaamiset oliottMyn23 void Opiskelija::annaPuhNro(string jokuNro) { *puhNumero=jokuNro; } Opiskelija::Opiskelija(const Opiskelija& viittaus) { cout<<"Kopiointimuodostin, olio "<<this<<endl; vuosikurssi=viittaus.vuosikurssi; nimi=new string; *nimi=*(viittaus.nimi); puhNumero=new string; *puhNumero=*(viittaus.puhNumero); }

Dynaamiset oliottMyn24 Opiskelija::~Opiskelija() { cout<<"Hajotin, olio "<<this<<endl; delete nimi; nimi=0; delete puhNumero; puhNumero=0; } void Opiskelija::naytaTiedot() { cout<<"Tiedot opiskelijasta:"<<endl <<"Nimi: "<<*nimi<<endl <<"Vuosikurssi: "<<vuosikurssi<<endl <<"Puhelinnumero: "<<*puhNumero<<endl; }

Dynaamiset oliottMyn25 int main(array ^args) { Opiskelija* ekaDynAito=new Opiskelija(3, "Sakari Viitanen", " "); cout<<"Aluksi ekaDynAito: "<<endl; ekaDynAito->naytaTiedot(); Opiskelija* ekaDynKopio=new Opiskelija(*ekaDynAito); cout<<"Aluksi ekaDynKopio: "<<endl; ekaDynKopio->naytaTiedot(); ekaDynKopio->annaPuhNro(); cout<<"Nyt kopioidun olion yhden tietoj\204sen arvo muutettiin:” <<endl; ekaDynKopio->naytaTiedot(); cout<<"Lopuksi tarkistetaan, ett\204 ekaDynAito ei muuttunut: ” <<endl; ekaDynAito->naytaTiedot(); delete ekaDynAito; delete ekaDynKopio; return 0; }

Dynaamiset oliottMyn26