Készítsünk olyan halmazokat reprezentáló osztályt, amelynek elemei halmazok is lehetnek. Ezt a következőképpen tegyük meg:
Készítsünk ősosztályt halmazok és elemei számára (Element). Ez tartalmaz egy elemnevet (string) és egy kiírást támogató virtuális print tagfüggvényt, amely egy ostream objektumot vár, valamint egy virtuális isSet bool függvényt, amely az Elementben false értékkel tér vissza, a halmazban pedig majd igazzal. Származtassunk tehát az Elementből egy halmaz (Set) osztályt. Ez tartalmazza más Element típusú pointerek listáját. A halmazban ezúttal nem rögzítjük az elemek maximális számát. Figyeljünk az egységbezárás alapelvére, használjunk konstruktorokat és privát tagváltozókat, valamint a dinamikus adattagokat tartalmazó osztályok implementálásánál előkerülő dolgokra (destruktor, másoló konstruktor, egyenlőségoperátor)! Implementáljuk az alábbi publikus tagfüggvényeket és operátorokat!
- operator+ (halmaz és elem között): hozzáad egy elemet a halmazhoz.
- operator- (halmaz és elem között): eltávolítja az elemet.
- isElement: megadja, hogy egy elem benne van-e a halmazban
- operator + (halmaz és halmaz között): az uniót számolja ki
- intersection: kiszámolja a halmazok metszetét
- operator =!, ==: összehasonlít két halmazt
- operator - (két halmaz között): kiszámolja a különbséget
Figyeljünk, hogy a halmaz egy elemet csak egyszer tartalmazhat, ezért egy új elem hozzáadásakor ellenőrizzük, hogy a halmazban nincs-e még benne az azonosító. Írjunk egy függvényt, ami egy adott hatványhalmazhoz elkészíti a hatványhalmazát.
Figyeljünk, hogy polimorfizmus csak referencián vagy referencián leresztül működik. Készítsünk globális << operátort, amely const Element&-t ír ki a virtuális print tagfüggvény hívásával!
Írjunk egy main függvényt, ahol készítünk két halmazt egyszerű elemekkel, majd az egyikhez hozzáadjuk a másikat. Írassuk ki az összetett halmaz elemeit a cout-ra a megírt << operátorral!