Взаимная дружба классов на C ++ с примерами
Предварительное условие: 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.