Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

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

Samankaltaiset esitykset


Esitys aiheesta: "Dynaamiset oliottMyn1 Dynaamiset oliot Dynaamisen olion tunnuksen esittely ja olion määrittely voivat tapahtua yhtäaikaisesti tai eri aikaan. Dynaamisen."— Esityksen transkriptio:

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

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

3 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;

4 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:

5 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; };

6 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; }

7 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; };

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

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

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

11 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!

12 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:

13 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; };

14 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); }

15 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; };

16 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; }

17 Dynaamiset oliottMyn17

18 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:

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

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

21 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); }

22 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; }

23 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); }

24 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; }

25 Dynaamiset oliottMyn25 int main(array ^args) { Opiskelija* ekaDynAito=new Opiskelija(3, "Sakari Viitanen", "040 399079"); 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; }

26 Dynaamiset oliottMyn26


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

Samankaltaiset esitykset


Iklan oleh Google