Gyakorló feladatok (9. hét)
Fontosabb kulcsszavak, fogalmak
- Többszörös öröklés
- Perzisztencia
- Generikus szerkezetek
- Perzisztencia megvalósítása (többszörös) örökléssel
Feladatok megoldásokkal
- Korábbi Komplex osztályunkból készítsünk egy perzisztens viselkedésű osztályt (PKomplex)! Az egyszerűség kedvéért a Komplex osztály műveleteit hagyjuk el, csak a setter/getter tagfüggvényeket valósítsuk meg!
class Komplex { double re; double im; public: Komplex(double _re = 0, double _im = 0) :re(_re), im(_im) {} void setRe(double _re) { re = _re; } void setIm(double _im) { im = _im; } double getRe() const { return re; } double getIm() const { return im; } };
A perzisztens működés megvalósításához alkalmazzuk az előadáson látott módszert, ahol a Serializable osztály read és write tagfüggvényeit valósítottuk úgy, hogy azok ki tudják írni és be tudják olvasni az objektum állapotát.
struct Serializable { virtual std::ostream& write(std::ostream&) const = 0; virtual std::istream& read(std::istream&) = 0; virtual ~Serializable() {}; };
A PKomplex osztály adatait szöveges formátumban írjuk ki! A kiírások elválasztására használjunk szeparátort (SEP), hogy jól látható legyen az egyes kiírások határa.
- Nézzük meg a PKomplex osztály használatát! Ezzel a megoldással az objektumok állapota akár a hálózaton is átküldhető lenne. Mit ír ki a következő programrészlet?
std::stringstream s; PKomplex pk(8,9), pk_vissza; pk.write(s); pk_vissza.write(cout); pk_vissza.read(s); pk_vissza.write(cout);
- Helyes-e ill. működik-e az alábbi kódrészlet?
Komplex k; k = pk; pk = k;
- A k = pk a kompatibilitás miatt működik, de fordítva nem. Oldjuk meg a konverziót!
- A Komplex példán keresztül láttuk, hogy már létező osztályból többszörös örökléssel tudunk perzisztens változatot készíteni. Új osztályokat szükség esetén eleve perzisztens viselkedésűre tervezünk. Készítsünk perzisztens viselkedésű 3 elemű egész vektort (PIntVec)! A vektor legyen indexelhető, de ne ellenőrizze az indexhatárokat! A méretet statikus konstansként kezeljük. Így könnyű lesz változtatni. A konstruktor nullázza ki a vektor elemeit! Az osztály származzon a Serializable osztályból, és valósítsa meg annak read és write metódusait!
- Próbáljuk ki az alábbi kódrészlettel:
std::stringstream s; PIntVec piv, piv_vissza; for (int i = 0; i < 3; i++) piv[i] = i; piv.write(s); piv_vissza.write(cout); piv_vissza.read(s); piv_vissza.write(cout);
- Általánosítsuk a vektorunkat! Készítsünk belőle olyan sablont (PVec), aminek sablonparaméterként megadható a mérete!
- Próbáljuk ki a sablonunkat!
PVec<double, 4> pdv, pdv_vissza; for (int i = 0; i < 4; i++) pdv[i] = i+0.1; pdv.write(s); pdv_vissza.write(cout); pdv_vissza.read(s); pdv_vissza.write(cout);
- Működik a PKomplex osztállyal is?
PVec<PKomplex, 5> pkv, pkv_vissza; pkv[1] = pk; pkv.write(s); pkv_vissza.write(cout); pkv_vissza.read(s); pkv_vissza.write(cout);
- Az a baj, hogy a PVec inserter-t és extractor-t használ. Ilyen függvény viszont nincs PKomplex osztályhoz. Oldjuk meg a problémát!
Utolsó frissítés: 2018-04-10 17.04