next up previous contents
Elõre: Operator overloading Fel: További flexibilitás a C++-ban Vissza: További flexibilitás a C++-ban

Rokonok és barátok

Az öröklés következtében különbözõ õstípusokból kiindulva teljes származási fákat, másképp kifejezve osztályhierarchiákat hozhatunk létre. A többszörös öröklés azt is lehetõvé teszi, hogy egy újabb típust több õstípus leszármazottjaként hozzunk létre. Íly módon egymással ronkonságban álló típusok deklarálhatók. Elképzelhetõ azonban, hogy egy programon belül egymástól teljesen független családfák jönnek létre. Az egy típuscsaládba (származási fába, családfába, osztályhierarchiába) tartozó típusok egymás rokonai, míg a különbözõ családba tartozók egymás számára teljesen idegenek.

Az életben az ember természetesen nem csak a rokonaival óhajtja tartani a kapcsolatot, hanem szüksége van barátokra is, azaz olyan egyedekre, akikkel nincs semmiféle származási kapcsolatban, de mégis fontosak egymás számára. Nos, egy C++ programban deklarált típusok esetében is hasonló a helyzet. Ha komolyan vettük az információrejtést, szigorúan kézbentartottuk a mezõhozzáférést az egyes típuscsaládok deklarációjakor, akkor egy adott típus egy függvénymezõje nem férhet hozzá egy nem rokon típus adatmezõihez. Márpedig nem zárható ki az az eset, amikor egy ilyen hozzáférés haszonnal járhat. Hogy egy C++ programban ezt a hasznot élvezhessük, a friend kulcsszóval megadhatjuk, hogy a programunk nem rokon tárolási egységei közül melyek állnak egymással barátságban.

Kicsit egzaktabban: Szükségünk lehet arra, hogy egy adott osztály privát adatmezõit egy olyan függvénnyel is manipulálhassuk, amelyik nem eleme az adott osztálynak. Ezt úgy érhetjük el, hogy az osztály deklarációjakor a friend kulcsszót követõen felsoroljuk azokat a külsõ függvényeket, amelyek számára jogot szeretnénk biztosítani az adott osztály adatmezõinek elérésére. A friend deklaráció az osztály-deklarációnak akár a private, akár a public részében is lehet. Lássunk néhány példát a "függvény-barátságra":

            int ext_func(void) { ... }
            ...
             class xx {
                       protected:
                         int data_1;
                       private:
                         int data_2;
                         friend int ext_func(void);
                       public:
                         xx(int d1, int d2);
                         int get_data_1(void);
                      };
Az elõbbi példában ext_func egy normál C függvény. Az xx osztály deklarációjakor jogot biztosítottunk számára a data_1 és data_2 adatmezõk elérésére. Természetesen egy másik osztály függvénymezõi is lehetnek barátok:
            class yy {
                       ....
                       void yy_func1(void);
                       ....
                     };
            class zz {
                       ....
                       void zz_func(void);
                       friend void yy::yy_func1(void);
                       ....
                     };
Itt tehát az yy osztály yy_func1 nevû függvénymezõjét deklaráltuk a zz osztály barátjának. Arra is lehetõségünk van, hogy az yy osztályból ne csak egy, hanem mindegyik függvénymezõt zz barátjává tegyük:
            class zz {
                       ....
                       void zz_func(void);
                       friend class yy;
                       ....
                     };

next up previous contents
Elõre: Operator overloading Fel: További flexibilitás a C++-ban Vissza: További flexibilitás a C++-ban