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.


