Folytatjuk állatorvosi sorozatunkat, ha ezt olvasod, akkor feltételezhetően már túl vagy az alábbi, erősorrendben hivatkozott posztokon:
- a Tömör a gyönyörben kifejlesztettünk egy C struktúrás LZW (bináris) fa építőt
- mélyebben megismerkedhettél a kóddal a Labormérés otthon, avagy hogyan dolgozok fel egy példát posztban
- amit jó (K&R) szokás szerint továbbfejlesztések sorát át elkezdtünk átteni C++-ba
Ez a poszt is ebbe a sorozatba illeszkedik.
Olyan objektum lenne jó, ami teljesen elrejtené a korábbi C-s progi logikáját (ami tk. az algoritmus, az LZW fa építésének logikája) mondjuk csak "<<" operátorral kéne belenyomni az inputról bejövő betűket az LZW fa objektumba, nem?
Lássuk, mit is szeretnénk:
int main () { char b; LZWBinFa binFa; while (std::cin >> b) { binFa << b; } binFa.kiir (); binFa.szabadit (); return 0; }
Ezt azért tehetjük meg, mert a LZWBinFa osztályban definiáltuk a << operátort:
void operator<<(char b) { if (b == '0') { // van '0'-s gyermeke az aktuális csomópontnak? if (!fa->nullasGyermek ()) // ha nincs, csinálunk { Csomopont *uj = new Csomopont ('0'); fa->ujNullasGyermek (uj); fa = &gyoker; } else // ha van, arra lépünk { fa = fa->nullasGyermek (); } } else { if (!fa->egyesGyermek ()) { Csomopont *uj = new Csomopont ('1'); fa->ujEgyesGyermek (uj); fa = &gyoker; } else { fa = fa->egyesGyermek (); } } }
Aminek kódja teljesen ugyanaz, mint az előző változat, csupán az osztálynév változott a csomópontot mostmár a "Csomopont" osztály absztrahálja. Ennek érdekessége, hogy definícióját beágyaztuk az LZWBinFa osztályba:
private: class Csomopont { public: Csomopont (char b = '/'):betu (b), balNulla (0), jobbEgy (0) {}; ~Csomopont () {}; Csomopont *nullasGyermek () { return balNulla; } Csomopont *egyesGyermek () { return jobbEgy; } void ujNullasGyermek (Csomopont * gy) { balNulla = gy; } void ujEgyesGyermek (Csomopont * gy) { jobbEgy = gy; } private: friend class LZWBinFa; char betu; Csomopont *balNulla; Csomopont *jobbEgy; Csomopont (const Csomopont &); Csomopont & operator=(const Csomopont &); };
Növeltük az absztrakció mértékét a csomópont definiálásával, de a meglévő kódot csak kicsi lépésekben akarjuk módosítani, s most az LZWBinFa módszerei ezért dolgoznak a csomópont védett tagjaival, hogy ez mehessen, ezért a csomópont barátjának deklaráltuk a fát elvonatkoztató tartalmazó osztályt.
Tekerj a tovább linkre a folytatásért.