Luokkien väliset koostesuhteet

Slides:



Advertisements
Samankaltaiset esitykset
Tuloksellinen Java-ohjelmointi Luku 3 Luokkien käyttäminen
Advertisements

Rajapintaluokat Rajapintaluokka luettelee metodit, joille tulee löytyä toteutus asianomaisen rajapinnan toteuttavista luokista. Rajapintaluokka on siis.
Koostumussuhde Jukka Juslin © Jukka Juslin.
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
Luokan otsikko- ja toteutustiedosto tMyn1 Luokan otsikko- ja toteutustiedosto •Tähän asti ohjelmaesimerkit on toteutettu siten, että kaikki koodi on yhdessä.
Muutamia käsitteitätMyn1 Muutamia käsitteitä •Perintä (inheritance) on luokkien välinen suhde, jossa johdettu luokka (subclass, derived class) perii kantaluokan,
Outi Grotenfelt & Vesa Ollikainen
Aloitetaan normalisoimattomasta raakadatasta
Julkaisukielet ja - tekniikat tMyn1 Julkaisukielet ja -tekniikat •Verkko-ohjelmointi voidaan jakaa kahteen osaan: asiakaspuolen ja palvelinpuolen ohjelmointiin.
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi71 Olio-ohjelmointi 2. osa: diat (2. välikoe) KYMENLAAKSON AMMATTIKORKEAKOULU Jarkko Ansamäki, 2001.
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.
ER (Entity-Relationship) –mallinnuksen perusteet
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.
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.
© Jukka Harju, Jukka Juslin
Tekstitiedostosta lukeminen tMyn1 Tekstitiedostosta lukeminen Tiedosto voidaan avata pelkästään lukemista varten tai kirjoittamista ja lukemista varten.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
Normalisointi2tMyn1 Yksi kelpo perusavain on sarakkeet laakNro ja vastAika. Toinen voisi olla potNro ja vastAika, kolmas voisi olla huoneNro ja vastAika,…,
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.
Lueteltu tyyppitMyn1 Lueteltu tyyppi Lueteltu tyyppi on tietotyyppi, jonka arvot luetellaan erikseen tyypin määrittelyn yhteydessä. Lueteltua tietotyyppiä.
Videosignaalin perusteet tMyn1 Videosignaalin perusteet Euroopassa televisiolähetyksissä kehyksiä lähetetään 25 kappaletta sekunnissa (frame rate 25 Hz).
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ä.
Koostekaavio – Composite Structure Diagram Kinnula – Kellolampi - Lehtosaari.
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,
Vesa Ollikainen & Outi Grotenfelt
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.
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.
Koostekaavio– composite structure diagram Mikko Näpänkangas.
Komponenttipohjainen ohjelmistotekniikka (TJTSS56) Osa 8 Kevätlukukausi 2010 Jyväskylän yliopisto Tietojenkäsittelytieteiden laitos Markku Sakkinen.
17. Kooste.
5. Kapselointi.
3. Olio-ohjelmoinista lyhyesti
Poikkeustenkäsittelylohkot try-catch
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
Rajapintaluokat Rajapintaluokka luettelee metodit, joille tulee löytyä toteutus asianomaisen rajapinnan toteuttavista luokista. Rajapintaluokka on siis.
Kantaluokan määrittely
Luokan määrittely class-määreellä
Tiedon tulostaminen/kirjoittaminen ”WriteLine”
eli oliotiedostojen käsittely
Esityksen transkriptio:

Luokkien väliset koostesuhteet Yhteyssuhde eli assosiaatio on yhteys luokkien välillä. Assosiaation erikoismuoto on koostesuhde (aggregation). Tässä mallinnetaan kokonaisuus/osa –suhdetta. Koostesuhde piirretään viivana, jonka kokonaispuolella on ontto vinoneliö. Voidaan myös puhua ”has-a” –suhteesta tai ”is-part-of” -suhteesta. Koostesuhde (aggregation) ei mitenkään liitä kokonaisuuden ja osan elinkaaria yhteen. Esimerkki koostesuhteesta (löyhä koostesuhde) kuvassa 1. Luokkien väliset koostesuhteet tMyn

Mikkelin Purjehtijat Purjevene Tämä luokka edustaa ”kokonaisuutta”. 1 * Tämä luokka edustaa toisen osaa Purjevene Kuva 1. Koosteyhteys (aggregation, löyhä kooste). Luokkien väliset koostesuhteet tMyn

Kokonaisuutta edustavan osuuden on hallittava osiensa elinkaaret. Siinä tapauksessa, että koostesuhteeseen halutaan voimakas omistussuhde ja elinkaarien yhteneväisyys, puhutaan vahvasta koosteesta (composite aggregation, composition). Tässä tapauksessa osakokonaisuus voi olla osana vain yhdessä vahvassa koosteessa kerrallaan. Kokonaisuutta edustavan osuuden on hallittava osiensa elinkaaret. Vahva koostesuhde piirretään viivana, jonka kokonaispuolella on täytetty vinoneliö. Esimerkki vahvasta koostesuhteesta kuvassa 2. Luokkien väliset koostesuhteet tMyn

Windows- Ikkuna Tämä luokka edustaa ”kokonaisuutta”. 1 Tämä luokka edustaa toisen osaa – ja voi olla vain yhden kokonaisuuden osana. * Kehys Kuva 2. Vahva koosteyhteys (composite aggregation, composition). Luokkien väliset koostesuhteet tMyn

Käytännössä koostesuhde rakennetaan siten, että luokka sisältää jonkin toisen luokan ilmentymän tai osoitteen toiseen luokkaan (miksei myös viittauksen). Otetaan ensiksi esimerkki löyhästä koostesuhteesta (aggregation). Nyt siis luokkarakenne on hoidettava niin, että osaolio voi/saa jäädä eloon, vaikka koosteolio ei enää olisikaan olemassa. Tämä onnistuu, kun toteutetaan koosteluokka niin, että siinä on osoitinviittaus osaolioon. Luokkien väliset koostesuhteet tMyn

Kun koosteluokkaan (Laitos) luodaan alla olevassa esimerkissä olio, niin silloin viitataan osoitinmuuttujalla osaluokan (Opettaja) olioon. Osaolion tietojäsenistä ei siis luoda (esim. kopiointimuodostimella) omia ilmentymiä tähän koosteolioon. Yksittäinen opettajailmentymä on siis ”pelkästään” töissä jonkin aikaa laitoksella: Luokkien väliset koostesuhteet tMyn

#include <iostream> #include <string> #include "stdafx.h" #include <iostream> #include <string> using namespace System; using namespace std; class Opettaja { public: Opettaja(); ~Opettaja(); void AsetaOpettajanNimi(); void AsetaOpettajanOsoite(); void HaeOpettajanNimi(); void HaeOpettajanOsoite(); private: string m_opettajannimi; string m_opettajanosoite; }; ”osat” Kirjoitetaan luokkaan leikki- hajotin, jotta nähdään sen tulevan kutsutuksi oikeaan aikaan. Luokkien väliset koostesuhteet tMyn

Opettaja::Opettaja() { cout<<"Opettaja-luokan oletusmuodostin, olio "<<this<<endl; AsetaOpettajanNimi(); AsetaOpettajanOsoite(); } void Opettaja::AsetaOpettajanNimi() cout<<"Anna opettajan nimi: "; getline(cin, m_opettajannimi); void Opettaja::AsetaOpettajanOsoite() cout<<"Anna opettajan osoite: "; getline(cin, m_opettajanosoite); void Opettaja::HaeOpettajanNimi() cout<<"Opettajan nimi on "<<m_opettajannimi<<endl; Luokkien väliset koostesuhteet tMyn

void Opettaja::HaeOpettajanOsoite() { cout<<"Opettajan osoite on "<<m_opettajanosoite<<endl; } Opettaja::~Opettaja() cout<<"Opettaja-luokan hajotin, olio "<<this<<endl; class Laitos public: Laitos(Opettaja* , string); ~Laitos(); void OsoitaOpettaja(Opettaja*); void AsetaLaitos(string); void HaeLaitoksenOpettajanNimi(); void HaeLaitoksenOpettajanOsoite(); void HaeLaitoksenNimi(); ”kokonaisuus” Luokkien väliset koostesuhteet tMyn

Opettaja* mp_opettaja; string m_laitoksennimi; }; private: // Aggregaatti Opettaja* mp_opettaja; string m_laitoksennimi; }; Laitos::Laitos(Opettaja* opettajaolio, string laitoksennimi) { cout<<"Laitos-luokan param. muodostin, olio "<<this<<endl; OsoitaOpettaja(opettajaolio); AsetaLaitos(laitoksennimi); } void Laitos::OsoitaOpettaja(Opettaja* opettajaolio) mp_opettaja=opettajaolio; void Laitos::AsetaLaitos(string laitoksennimi) m_laitoksennimi=laitoksennimi; Luokkien väliset koostesuhteet tMyn

void Laitos::HaeLaitoksenOpettajanNimi() { mp_opettaja->HaeOpettajanNimi(); } void Laitos::HaeLaitoksenOpettajanOsoite() mp_opettaja->HaeOpettajanOsoite(); void Laitos::HaeLaitoksenNimi() cout<<"Laitoksen nimi on "<<m_laitoksennimi<<endl; Laitos::~Laitos() cout<<"Laitos-luokan hajotin, olio "<<this<<endl; Luokkien väliset koostesuhteet tMyn

int main(array<System::String ^> ^args) { Opettaja ope=Opettaja(); ope.HaeOpettajanNimi(); Laitos eka(&ope, string("Tekniikka ja liikenne")); eka.HaeLaitoksenOpettajanNimi(); eka.HaeLaitoksenNimi(); } return 0; Kerrotaan muodostimelle, että kysymyksessä on string-luokan objekti. Nyt ei eka-olio ole enää olemassa! Luokkien väliset koostesuhteet tMyn

Edellisessä esimerkissä voidaan oliot muuttaa muistinvarausluokaltaan dynaamisiksi – kaikki muu pysyisi ennallaan: Luokkien väliset koostesuhteet tMyn

int main(array<System::String ^> ^args) { Opettaja* ope=new Opettaja(); ope->HaeOpettajanNimi(); Laitos* eka=new Laitos(ope, string("Tekniikka ja liikenne")); eka->HaeLaitoksenOpettajanNimi(); eka->HaeLaitoksenNimi(); delete eka; delete ope; return 0; } Luokkien väliset koostesuhteet tMyn

Kuvassa 3 tuosta seuraavasta esimerkistä on UML-kaavio. Tehdään edelliseen esimerkkiin sellainen muutos, että nyt kummassakin luokassa tietojäsenten muistinvarausluokka on dynaaminen. Tässä tapauksessa hajottimetkin ovat tarpeellisia. Kuvassa 3 tuosta seuraavasta esimerkistä on UML-kaavio. Luokkien väliset koostesuhteet tMyn

#include <iostream> #include <string> #include "stdafx.h" #include <iostream> #include <string> using namespace System; using namespace std; class Opettaja { public: Opettaja(); ~Opettaja(); void AsetaOpettajanNimi(); void AsetaOpettajanOsoite(); void HaeOpettajanNimi(); void HaeOpettajanOsoite(); private: string* mp_opettajannimi; string* mp_opettajanosoite; }; Luokkien väliset koostesuhteet tMyn

Opettaja::Opettaja() { cout<<"Opettaja-luokan oletusmuodostin, olio "<<this<<endl; mp_opettajannimi=new string; AsetaOpettajanNimi(); mp_opettajanosoite=new string; AsetaOpettajanOsoite(); } void Opettaja::AsetaOpettajanNimi() cout<<"Anna opettajan nimi: "; getline(cin, *mp_opettajannimi); void Opettaja::AsetaOpettajanOsoite() cout<<"Anna opettajan osoite: "; getline(cin, *mp_opettajanosoite); Luokkien väliset koostesuhteet tMyn

void Opettaja::HaeOpettajanNimi() { cout<<"Opettajan nimi on "<<*mp_opettajannimi<<endl; } void Opettaja::HaeOpettajanOsoite() cout<<"Opettajan osoite on "<<*mp_opettajanosoite<<endl; Opettaja::~Opettaja() cout<<"Opettaja-luokan hajotin, olio "<<this<<endl; delete mp_opettajannimi; delete mp_opettajanosoite; Luokkien väliset koostesuhteet tMyn

Laitos(Opettaja* , string); ~Laitos(); void OsoitaOpettaja(Opettaja*); class Laitos { public: Laitos(Opettaja* , string); ~Laitos(); void OsoitaOpettaja(Opettaja*); void AsetaLaitos(string); void HaeLaitoksenOpettajanNimi(); void HaeLaitoksenOpettajanOsoite(); void HaeLaitoksenNimi(); private: // Aggregaatti Opettaja* mp_opettaja; string* mp_laitoksennimi; }; Luokkien väliset koostesuhteet tMyn

Laitos::Laitos(Opettaja* opettajaolio, string laitoksennimi) { cout<<"Laitos-luokan param. muodostin, olio "<<this<<endl; OsoitaOpettaja(opettajaolio); mp_laitoksennimi=new string; AsetaLaitos(laitoksennimi); } void Laitos::OsoitaOpettaja(Opettaja* opettajaolio) mp_opettaja=opettajaolio; void Laitos::AsetaLaitos(string laitoksennimi) *mp_laitoksennimi=laitoksennimi; void Laitos::HaeLaitoksenOpettajanNimi() mp_opettaja->HaeOpettajanNimi(); Luokkien väliset koostesuhteet tMyn

void Laitos::HaeLaitoksenOpettajanOsoite() { mp_opettaja->HaeOpettajanOsoite(); } void Laitos::HaeLaitoksenNimi() cout<<"Laitoksen nimi on "<<*mp_laitoksennimi<<endl; Laitos::~Laitos() cout<<"Laitos-luokan hajotin, olio "<<this<<endl; delete mp_laitoksennimi; Luokkien väliset koostesuhteet tMyn

int main(array<System::String ^> ^args) { Opettaja* ope=new Opettaja(); ope->HaeOpettajanNimi(); Laitos* eka=new Laitos(ope, string("Tekniikka ja liikenne")); eka->HaeLaitoksenOpettajanNimi(); eka->HaeLaitoksenOpettajanOsoite(); eka->HaeLaitoksenNimi(); delete eka; ope->HaeOpettajanOsoite(); delete ope; return 0; } Luokkien väliset koostesuhteet tMyn

Luokkien väliset koostesuhteet tMyn

Opettaja - mp_opettajannimi: string* - mp_opettajanosoite: string* + Opettaja() + ~Opettaja() + AsetaOpettajanNimi(): void + AsetaOpettajanOsoite(): void + HaeOpettajanNimi(): void + HaeOpettajanOsoite(): void Laitos - mp_opettaja: Opettaja* - mp_laitoksennimi: string* + Laitos(opettajaolio: Opettaja*, laitoksennimi: string) + ~Laitos() + OsoitaOpettaja(opettajaolio: Opettaja*): void + AsetaLaitos(laitoksennimi: string): void + HaeLaitoksenOpettajanNimi(): void + HaeLaitoksenOpettajanOsoite(): void + HaeLaitoksenNimi(): void Kuva 3. UML-kaavio edellisestä esimerkistä, aggregation. Luokkien väliset koostesuhteet tMyn

Seuraava esimerkki sisältää vahvan koosteyhteyden (composition) Seuraava esimerkki sisältää vahvan koosteyhteyden (composition). Nyt osaoliolla ja koosteoliolla on yhtenevä elinkaari. Ratkaisu toimii helposti siten, että koosteluokassa on suora viittaus osaolioon. Tällöin osaolio syntyy automaattisesti koosteolion tilanvarauksen yhteydessä, ja osaolio häviää automaattisesti koosteolion tilanvapautuksen yhteydessä. Koosteolion on aina pakko sisältää osaolio. Luokkien väliset koostesuhteet tMyn

Sekä koosteluokka että osaolioiden luokat voivat sisältää parametrillisia muodostimia. Yleensä koosteluokan muodostimelle välitetään parametreina kaikille muodostimille välitettävät tiedot. Koosteluokan muodostimessa ohjataan parametrit edelleen osaolioiden luokkien muodostimelle. Luokkien väliset koostesuhteet tMyn

#include <iostream> #include <string> #include "stdafx.h" #include <iostream> #include <string> using namespace System; using namespace std; class Pvm { public: Pvm(int, int, int, int, int); ~Pvm(); void AsetaPaiva(int); void AsetaKuukausi(int); void AsetaVuosi(int); void AsetaTunti(int); void AsetaMinuutti(int); void HaePvm(); Otetaan leikkihajotin mukaan, jotta varmistutaan, että se tulisi kutsutuksi oikeassa paikassa. Luokkien väliset koostesuhteet tMyn

Pvm::Pvm(int paiva, int kuukausi, int vuosi, int tunti, int minuutti) private: int m_paiva; int m_kuukausi; int m_vuosi; int m_tunti; int m_minuutti; }; Pvm::Pvm(int paiva, int kuukausi, int vuosi, int tunti, int minuutti) { cout<<"Pvm-luokan 5.param. muodostin, olio "<<this<<endl; AsetaPaiva(paiva); AsetaKuukausi(kuukausi); AsetaVuosi(vuosi); AsetaTunti(tunti); AsetaMinuutti(minuutti); } void Pvm::AsetaPaiva(int paiva) m_paiva=paiva; Luokkien väliset koostesuhteet tMyn

void Pvm::AsetaKuukausi(int kuuukausi) { m_kuukausi=kuuukausi; } void Pvm::AsetaVuosi(int vuosi) m_vuosi=vuosi; void Pvm::AsetaTunti(int tunti) m_tunti=tunti; void Pvm::AsetaMinuutti(int minuutti) m_minuutti=minuutti; Luokkien väliset koostesuhteet tMyn

cout<<"Pvm-luokan hajotin, olio "<<this<<endl; } Pvm::~Pvm() { cout<<"Pvm-luokan hajotin, olio "<<this<<endl; } void Pvm::HaePvm() cout<<"Ajankohta on "<<m_paiva<<"."<<m_kuukausi<<".” <<m_vuosi<<" klo. "<<m_tunti<<"."<<m_minuutti<<endl; Luokkien väliset koostesuhteet tMyn

Palaveri(int, int, int, int, int, string&, string&); ~Palaveri(); class Palaveri { public: Palaveri(int, int, int, int, int, string&, string&); ~Palaveri(); void AsetaPaikka(string&); void AsetaAihe(string&); void HaeTiedot(); void HaeAjankohta(); private: Pvm m_ajankohta; string m_paikka; string m_aihe; }; Viiteparametrien käyttö ”säästää” yhden kopiointitapahtuman. Luokkien väliset koostesuhteet tMyn

std::string& paikka, std::string& aihe) : Palaveri::Palaveri(int paiva, int kuukausi, int vuosi, int tunti, int minuutti, std::string& paikka, std::string& aihe) : m_ajankohta(paiva, kuukausi, vuosi, tunti, minuutti) { cout<<"Palaveri-luokan muodostin, olio "<<this<<endl; AsetaPaikka(paikka); AsetaAihe(aihe); } Parametrit välitetään osaolioille kirjoittamalla muodostimen otsikkorivin jälkeen kaksoispisteen jälkeen ne osaoliot, joiden parametrillista muodostinta halutaan kutsuttavan. Kunkin koosteluokassa määritellyn osaolion nimen yhteyteen sulkeisiin kirjoitetaan parametrina välitettävien tietojen arvot. Välitettävien parametrien tyypit ja lukumäärä määräävät kutsuttavan muodostimen. Luokkien väliset koostesuhteet tMyn

void Palaveri::AsetaPaikka(std::string& paikka) { m_paikka=paikka; } void Palaveri::AsetaAihe(std::string& aihe) m_aihe=aihe; Luokkien väliset koostesuhteet tMyn

void Palaveri::HaeTiedot() { m_ajankohta.HaePvm(); cout<<"Paikkana on: "<<m_paikka<<endl <<"Aiheena on: "<<m_aihe<<endl; } Palaveri::~Palaveri() cout<<"Palaveri-luokan hajotin, olio "<<this<<endl; void Palaveri::HaeAjankohta() Luokkien väliset koostesuhteet tMyn

int main(array<System::String ^> ^args) { //Pvm joku=Pvm(3,9,2009,13,30); //joku.HaePvm(); //Palaveri eka(11, 3, 2009, 14, 45, string("Mikpoli MA307"), string("Neuvottelukunnan kriisipalaveri")); Palaveri* eka=new Palaveri(11, 3, 2009, 14, 45, string("Mikpoli MA307"), string("Neuvottelukunnan kriisipalaveri")); eka->HaeTiedot(); delete eka; //Palaveri eka=Palaveri(11, 3, 2009, 14, 45, string("Mikpoli MA307"), //eka.HaeTiedot(); return 0; } Kerrotaan muodostimelle, että kysymyksessä on string-luokan objekti. Luokkien väliset koostesuhteet tMyn

Luokkien väliset koostesuhteet tMyn

Kuvassa 4 tuosta seuraavasta esimerkistä on UML-kaavio. Edellisessä esimerkissä kummankin luokan tietojäseniä olisi voinut olla muistinvarausluokaltaan dynaamisia. Silloin kumpikin luokka tarvitsisi todellisen hajottimen, kts. seuraava esimerkki. Kuvassa 4 tuosta seuraavasta esimerkistä on UML-kaavio. Luokkien väliset koostesuhteet tMyn

#include <iostream> #include <string> #include "stdafx.h" #include <iostream> #include <string> using namespace System; using namespace std; class Pvm { public: Pvm(int, int, int, int, int); ~Pvm(); void AsetaPaiva(int); void AsetaKuukausi(int); void AsetaVuosi(int); void AsetaTunti(int); void AsetaMinuutti(int); void HaePvm(); Luokkien väliset koostesuhteet tMyn

Pvm::Pvm(int paiva, int kuukausi, int vuosi, int tunti, int minuutti) private: int* mp_paiva; int* mp_kuukausi; int* mp_vuosi; int* mp_tunti; int* mp_minuutti; }; Pvm::Pvm(int paiva, int kuukausi, int vuosi, int tunti, int minuutti) : mp_paiva(NULL), mp_kuukausi(NULL), mp_vuosi(NULL), mp_tunti(NULL), mp_minuutti(NULL) { cout<<"Pvm-luokan muodostin, olio "<<this<<endl; mp_paiva=new int; AsetaPaiva(paiva); On hyvä ajatus alustaa osoitinmuuttujat muodostimessa. Luokkien väliset koostesuhteet tMyn

AsetaKuukausi(kuukausi); mp_vuosi=new int; AsetaVuosi(vuosi); mp_kuukausi=new int; AsetaKuukausi(kuukausi); mp_vuosi=new int; AsetaVuosi(vuosi); mp_tunti=new int; AsetaTunti(tunti); mp_minuutti=new int; AsetaMinuutti(minuutti); } void Pvm::AsetaPaiva(int paiva) { *mp_paiva = paiva; void Pvm::AsetaKuukausi(int kuukausi) *mp_kuukausi=kuukausi; Luokkien väliset koostesuhteet tMyn

void Pvm::AsetaVuosi(int vuosi) { *mp_vuosi=vuosi; } void Pvm::AsetaTunti(int tunti) *mp_tunti=tunti; void Pvm::AsetaMinuutti(int minuutti) *mp_minuutti=minuutti; Pvm::~Pvm() cout<<"Pvm-luokan hajotin, olio "<<this<<endl; delete mp_paiva; delete mp_kuukausi; delete mp_vuosi; delete mp_tunti; delete mp_minuutti; Luokkien väliset koostesuhteet tMyn

Palaveri(int, int, int, int, int, string&, string&); ~Palaveri(); void Pvm::HaePvm() { cout<<"Ajankohta on "<<*mp_paiva<<"."<<*mp_kuukausi<<".” <<*mp_vuosi<<" klo. "<<*mp_tunti<<"."<<*mp_minuutti<<endl; } class Palaveri public: Palaveri(int, int, int, int, int, string&, string&); ~Palaveri(); void AsetaPaikka(string&); void AsetaAihe(string&); void HaeTiedot(); void HaeAjankohta(); private: Pvm m_ajankohta; string* mp_paikka; string* mp_aihe; }; Viiteparametrin käyttö ”säästää” yhden kopiointitapahtuman. Luokkien väliset koostesuhteet tMyn

std::string& paikka, std::string& aihe) : Palaveri::Palaveri(int paiva, int kuukausi, int vuosi, int tunti, int minuutti, std::string& paikka, std::string& aihe) : m_ajankohta(paiva, kuukausi, vuosi, tunti, minuutti), mp_paikka(NULL), mp_aihe(NULL) { cout<<"Palaveri-luokan muodostin, olio "<<this<<endl; mp_paikka=new string; AsetaPaikka(paikka); mp_aihe=new string; AsetaAihe(aihe); } void Palaveri::AsetaPaikka(std::string& paikka) *mp_paikka = paikka; Luokkien väliset koostesuhteet tMyn

void Palaveri::AsetaAihe(std::string& aihe) { *mp_aihe = aihe; } Palaveri::~Palaveri() cout<<"Palaveri-luokan hajotin, olio "<<this<<endl; delete mp_paikka; delete mp_aihe; void Palaveri:: HaeTiedot() m_ajankohta.HaePvm(); cout<<"Paikkana on: "<<*mp_paikka<<endl <<"Aiheena on: "<<*mp_aihe<<endl; Luokkien väliset koostesuhteet tMyn

void Palaveri:: HaeAjankohta() { m_ajankohta.HaePvm(); } int main(array<System::String ^> ^args) Palaveri* p_yksi = new Palaveri(9,3,2009,13,30, string("Mikpoli MA307"), string("Neuvottelukunnan kriisipalaveri")); p_yksi-> HaeTiedot(); delete p_yksi; return 0; Kerrotaan muodostimelle, että kysymyksessä on string-luokan objekti. Luokkien väliset koostesuhteet tMyn

Yhtä hyvin olio voi olla muistinvarausluokaltaan automaattinen: Luokkien väliset koostesuhteet tMyn

int main(array<System::String ^> ^args) { … int main(array<System::String ^> ^args) { Palaveri yksi=Palaveri(9,3,2009,13,30, string("Mikpoli MA307"), string("Neuvottelukunnan kriisipalaveri")); yksi.HaeTiedot(); return 0; } Luokkien väliset koostesuhteet tMyn

Pvm mp_paiva: int* - mp_kuukausi: int* - mp_vuosi: int* mp_tunti: int* mp_minuutti: int* + Pvm(paiva: int, kuukausi: int, vuosi: int, tunti: int, minuutti: int) + ~Pvm() + AsetaPaiva(paiva: int): void + AsetaKuukausi(kuukausi: int): void + AsetaVuosi(vuosi: int): void + AsetaTunti(tunti: int): void + AsetaMinuutti(minuutti: int): void + HaePvm(): void Palaveri - m_ajankohta: Pvm mp_paikka: string* mp_aihe: string* + Palaveri(paiva: int, kuukausi: int, vuosi: int, tunti: int, minuutti: int, paikka:string&, aihe: string&) + ~Palaveri() + AsetaPaikka(paikka: string&): void + AsetaAihe(aihe: string&): void + HaeTiedot(): void + HaeAjankohta(): void Kuva 4. UML-kaavio edellisestä esimerkistä, composition. Luokkien väliset koostesuhteet tMyn