Kompositio (composition) on vahva "has-a" -suhde, jossa:
Esimerkki: Henkilö omistaa osoitteen. Kun henkilö tuhoutuu, myös osoite tuhoutuu.
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.
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.
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.
Muokkaa esimerkkiä niin, että Henkilo-luokalla on myös Osoite (kompositio komposition sisällä).
Toteuta Yritys ja Henkilo -luokat käyttäen aggregaatiota komposition sijaan.
Vaatimukset:
shared_ptr:llä main-funktiossa (eivät yrityksen konstruktorissa)vector<shared_ptr<Henkilo>> työntekijöillelisaaHenkilo(shared_ptr<Henkilo>)Testaa että:
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: 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).