Взаимная дружба классов на C ++ с примерами

Опубликовано: 29 Декабря, 2021

Предварительное условие: Friend Class в C ++
Класс-друг может иметь доступ к закрытым и защищенным членам других классов, в которых он объявлен как друг. Иногда полезно разрешить определенному классу получить доступ к закрытым членам другого класса.
Ниже приведена программа для иллюстрации класса друзей:

CPP

// C++ program to illustrate friend class
#include <iostream>
using namespace std;
// Class A
class A {
private :
// Private member of Class A
int a;
public :
// Constructor to initialise private
// member of class A
A() { a = 0; }
// Make friend class B using a friend
// keyword
friend class B;
};
// Class B
class B {
private :
// Private members of class B
int b;
public :
// Members function of class B
void showA(A& x)
{
// Since B is friend of A,
// it can access private members
// of class A
cout << "Accessed Private "
<< "Member of class A " ;
cout << "A::a = " << xa;
}
};
int main()
{
// Object of class A
A a;
// Object of class B
B b;
// Member function of friend class B
b.showA(a);
return 0;
}
Выход:
 Доступ к частному члену класса A
A :: a = 0

Взаимная дружба классов: считается, что классы A и B находятся во взаимной дружбе, если класс A является классом друзей класса B, а класс B - классом друзей класса A. Из-за установления дружбы между этими двумя классами оба классы могут обращаться друг к другу с защищенными и частными членами, используя свои собственные функции-члены.
При обычном объявлении и определении функций в обоих этих классах будет встречаться общая синтаксическая ошибка, которая сигнализирует о том, что класс, объявленный первым, не может получить доступ к элементам данных последующего класса, даже если он стал другом.
Поэтому дружба не взаимна . Если класс A является другом B , то B не становится другом класса A автоматически.
Но мы можем создать взаимную дружбу классов, избегая ошибки, произошедшей выше, функции в первом классе, который обращается к элементам данных второго класса, определяются после второго класса с использованием оператора разрешения области видимости.
Предположим, что класс A был определен первым в программе, а класс B был определен после класса A. Функции-члены в классе A, имеющие доступ к данным класса B, должны быть определены после класса B. Это сделано для того, чтобы компилятор сначала прочитал класс B, который, в свою очередь, предоставит компилятору информацию о том, что класс A является другом класса B , и, следовательно, ему разрешен доступ к его членам.
Ниже представлена программа, иллюстрирующая взаимную дружбу классов:

CPP

// C++ program to illustrate mutual
// friendship of classes
#include <iostream>
using namespace std;
// Forward Declaration
class B;
// Class A
class A {
// Member of class A
data; int
public :
// Make B as a friend of class A
friend class B;
// Constructor to initialise member
// of class A
A( int d) { data = d; }
// Function to get data of friend
// class B
void get_data_B(B objb);
};
// Class B
class B {
// Member of class B
int dataB;
public :
// Making A a friend of class B
friend class A;
// Constructor to initialise member of
// class B
B( int d) { dataB = d; }
// Function to get the data of
// friend class A
void get_data_A(A obja)
{
cout << "Data of A is: "
<< obja.data;
}
};
// Function for accessing friend class
// B's object
void A::get_data_B(B objb)
{
cout << "Data of B is: "
<< objb.dataB;
}
// Driver Code
int main()
{
// Object of class A
A a(10);
// Object of class B
B b(20);
// Print data of class A
b.get_data_A(a);
cout << endl;
// Print data of class B
a.get_data_B(b);
return 0;
}
Выход:
 Данные A: 10
Данные B: 20

В приведенной выше программе как класс A, так и класс B являются общими друзьями. Следовательно, доступ к частному члену класса A также может быть выполнен из функции-члена в классе B, а доступ к частному члену класса B также может быть выполнен из функции-члена в классе A.

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .