Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

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

Samankaltaiset esitykset


Esitys aiheesta: "Luokan otsikko- ja toteutustiedosto tMyn1 Luokan otsikko- ja toteutustiedosto •Tähän asti ohjelmaesimerkit on toteutettu siten, että kaikki koodi on yhdessä."— Esityksen transkriptio:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

20 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):

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

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

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

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

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

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

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

28 Luokan otsikko- ja toteutustiedosto tMyn28

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

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

31 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

32 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

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

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

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

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

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

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

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

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


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

Samankaltaiset esitykset


Iklan oleh Google