friend class
Főnév
friend class (tsz. friend classes)
- (informatika) A friend class (barátosztály) a C++ egyik speciális funkciója, amely lehetővé teszi egy adott osztály számára, hogy hozzáférjen egy másik osztály privát és védett tagjaihoz. Ez akkor hasznos, ha két osztály szoros kapcsolatban áll egymással, és egyik osztály privát adatait közvetlenül el kell érnie egy másik osztályból.
1. Mi az a friend class?
Általában az osztályok privát tagjaihoz csak az osztály saját tagfüggvényei és a belőle származtatott osztályok férhetnek hozzá. Azonban, ha egy másik osztály friend class-ként van megjelölve, akkor az is elérheti az adott osztály privát adattagjait és metódusait.
A friend class deklarációja az alábbi módon történik:
class B; // Előre deklaráció
class A {
private:
int secretValue;
public:
A(int val) : secretValue(val) {}
// Barátosztály megjelölése
friend class B;
};
class B {
public:
void showSecret(const A& obj) {
// Eléri A osztály privát adattagját
std::cout << "A titkos értéke: " << obj.secretValue << std::endl;
}
};
int main() {
A objA(42);
B objB;
objB.showSecret(objA); // Kimenet: A titkos értéke: 42
return 0;
}
Ebben a példában a B osztály barátként lett megjelölve az A osztályban, így a B osztály függvényei elérhetik az A osztály privát változóit.
2. Miért van szükség friend class-ra?
A friend class hasznos lehet bizonyos helyzetekben, például:
- Szoros kapcsolatú osztályoknál – Ha két osztály szoros kapcsolatban áll egymással, és egyik osztály adatait a másiknak el kell érnie.
- Adatkezelő és műveleti osztályoknál – Ha egy osztály tárolja az adatokat, és egy másik végzi az adatok feldolgozását.
- Operátor túlterhelésekor – Olyan operátorok túlterhelésénél, ahol két különböző osztály működik együtt.
3. Friend Class és Kapszulázás
A friend class megsértheti az adatkapszulázás (encapsulation) alapelvét, mert lehetővé teszi, hogy egy külső osztály elérje egy másik osztály privát tagjait. Emiatt csak akkor érdemes használni, ha feltétlenül szükséges.
4. Több osztály közötti kapcsolat friend class-szal
A friend class több osztály között is alkalmazható, ahol egyik osztály teljes hozzáférést kap a másikhoz.
Példa: Két szorosan összefüggő osztály
#include <iostream>
class Engine; // Előre deklaráció
class Car {
private:
std::string model;
int speed;
public:
Car(std::string m, int s) : model(m), speed(s) {}
friend class Engine;
};
class Engine {
public:
void tuneCar(Car& car) {
car.speed += 50; // Növeli az autó sebességét
std::cout << "A " << car.model << " teljesítménye növelve, új sebesség: " << car.speed << " km/h\n";
}
};
int main() {
Car myCar("BMW", 150);
Engine myEngine;
myEngine.tuneCar(myCar); // Kimenet: A BMW teljesítménye növelve, új sebesség: 200 km/h
return 0;
}
Ebben a példában: - A Car osztály tárolja az autó adatait. - Az Engine osztály (mint barátosztály) képes módosítani a Car privát változóit.
5. Friend Class vs Friend Function
Mind a friend function, mind a friend class lehetőséget biztosít az osztály privát tagjaihoz való hozzáférésre, de van néhány fontos különbség:
| Tulajdonság | Friend Function | Friend Class |
|---|---|---|
| Mire vonatkozik? | Egyetlen függvényre | Egy teljes osztályra |
| Hozzáférés | Az osztály privát tagjaihoz, de csak a barátfüggvényben | Az osztály privát tagjaihoz bármely barátosztálybeli metódusban |
| Használati eset | Egyszerű függvények és operátor túlterhelések | Ha egy teljes osztálynak kell hozzáférnie egy másik osztály belső adataihoz |
6. Friend Class és Öröklődés
A friend class nem öröklődik! Ha egy osztály B barátként van megjelölve A-ban, de C az A-ból származik, akkor B nem lesz barátja C-nek. Példa erre:
class A {
private:
int value;
public:
A(int v) : value(v) {}
friend class B;
};
class B {
public:
void showValue(const A& obj) {
std::cout << "A értéke: " << obj.value << std::endl;
}
};
class C : public A {
// C nem fér hozzá A privát tagjához, mert nem barátja
};
int main() {
A objA(100);
B objB;
objB.showValue(objA); // Működik
// C osztály nem fér hozzá A privát tagjaihoz
return 0;
}
Az öröklődés nem örökíti tovább a friend class kapcsolatot!
7. Összegzés
A friend class egy hatékony eszköz a C++-ban, amely lehetővé teszi, hogy egy osztály hozzáférjen egy másik osztály privát adattagjaihoz. Fontos azonban, hogy megfelelően és körültekintően használjuk, mert könnyen megsértheti a kapszulázás elvét.
Mikor használjunk friend class-t? ✔ Ha két osztály szorosan együttműködik
✔ Ha egy másik osztálynak teljes hozzáférésre van szüksége az adatokhoz
✔ Ha operátorokat kell túlterhelni külső osztályok között
Mikor ne használjuk? ❌ Ha az osztályok közötti kapcsolatot más módon is meg lehet oldani (pl. getter/setter metódusokkal)
❌ Ha a kapszulázás és modularitás sérülne
Ha megfelelően alkalmazzuk, a friend class segíthet hatékonyabb és tisztább kódot írni, különösen olyan esetekben, ahol két osztály szorosan együttműködik.
- friend class - Szótár.net (en-hu)
- friend class - Sztaki (en-hu)
- friend class - Merriam–Webster
- friend class - Cambridge
- friend class - WordNet
- friend class - Яндекс (en-ru)
- friend class - Google (en-hu)
- friend class - Wikidata
- friend class - Wikipédia (angol)