Olio-ohjelmointi
Kompositio

Mitä on kompositio?

Kompositio (composition) on vahva "has-a" -suhde, jossa:

  • Sisältävä olio omistaa sisältämänsä olion
  • Sisältämä olio luodaan sisältävän olion konstruktorissa
  • Sisältämä olio tuhoutuu automaattisesti kun sisältävä olio tuhoutuu
  • UML-diagrammissa merkitään mustalla vinoneliöllä

Esimerkki: Henkilö omistaa osoitteen. Kun henkilö tuhoutuu, myös osoite tuhoutuu.

Tehtävä 1: Kompositio pinomuistissa

Luo luokka Osoite, jolla on jäsenmuuttujat katu, postinumero ja kaupunki (string) ja konstruktori. Luo luokka Henkilo, jonka jäsenmuuttujana on Osoite-tyyppinen muuttuja osoite.

Henkilo-luokan konstruktori luo uuden Osoite-olion. Luo pääohjelmassa Henkilo-olio ja tulosta henkilön osoitetiedot.

Huom: Tämä on kompositio, koska Henkilo omistaa osoitteen ja osoite tuhoutuu kun henkilö tuhoutuu.

Tehtävä 2: Kompositio dynaamisessa muistissa

Tee edellinen esimerkki dynaamisessa muistissa käyttäen unique_ptr:ää. Henkilo-luokka luo Osoite-olion dynaamisesti konstruktorissa make_unique:lla.

Vihje: Käytä unique_ptr:ää kompositiossa kun tarvitset dynaamista muistia. Se ilmaisee selkeästi omistajuuden ja hoitaa muistinhallinnan automaattisesti.

Tehtävä 3: Kompositio vektorissa

Luo luokka Yritys, joka sisältää useita Henkilo-olioita vektorissa (työntekijät). Yritys-luokka luo työntekijät konstruktorissa ja työntekijät tuhoutuvat yrityksen tuhoutuessa.

Tehtävä 4: Kompositio komposition sisällä

Muokkaa esimerkkiä niin, että Henkilo-luokalla on myös Osoite (kompositio komposition sisällä).

Lisätehtävä: Aggregaatio - Yritys ja Henkilo

Toteuta Yritys ja Henkilo -luokat käyttäen aggregaatiota komposition sijaan.

Vaatimukset:

  • Henkilöt luodaan shared_ptr:llä main-funktiossa (eivät yrityksen konstruktorissa)
  • Yritys-luokalla on vector<shared_ptr<Henkilo>> työntekijöille
  • Yritys-luokalla on metodi lisaaHenkilo(shared_ptr<Henkilo>)
  • Henkilöt voivat elää itsenäisesti ilman yritystä
  • Sama henkilö voi kuulua useampaan yritykseen (jaettu omistajuus)
  • Kun yritys tuhoutuu, henkilöt jatkavat elämäänsä
  • Henkilöt tuhoutuvat vasta kun kaikki viittaukset (yritykset ja main-funktion muuttujat) poistetaan

Testaa että:

  • Luo 3 henkilöä main-funktiossa
  • Luo 2 yritystä
  • Lisää henkilöitä molempiin yrityksiin (yksi henkilö molempiin!)
  • Tuhoa yksi yritys (henkilöt jatkavat)
  • Tulosta toisen yrityksen henkilöstö

Lisää destruktoreihin cout-tulosteet, jotta näet milloin oliot todella tuhoutuvat!

Huom! Tällä kurssilla vahva kompositio on tärkein, mutta on hyvä tietää ero myös aggregaatioon:

Kompositio vs. Aggregaatio

Kompositio: Vahva omistajuus, käytä unique_ptr (musta vinoneliö UML:ssä)

Aggregaatio: Jaettu omistajuus, käytä shared_ptr (valkoinen vinoneliö UML:ssä)

Esimerkki: Henkilö omistaa osoitteen (kompositio), mutta joukkue vain viittaa pelaajiin (aggregaatio).



Toggle Menu