О функциях-друзьях
Если ваша программа использует друзей для доступа к частным данным класса, вы можете ограничить количество функций-элементов класса-друга, который может обращаться к частным данным, используя дружественные функции. Для объявления функции-друга укажите ключевое слово friend, за которым следует полный прототип, как показано ниже:
public: friend class_name::function_name(parameter types);
Только функции-элементы, указанные как друзья, могут напрямую обращаться к частным элементам класса, используя оператор точку. Если ваша программа начинает ссылаться на один класс из другого, вы можете получить синтаксические ошибки, если порядок определения классов неверен. В данном случае определение класса book использует прототипы функций, определенные в классе librarian. Следовательно, определение класса librarian должно предшествовать определению класса book. Однако если вы проанализируете класс librarian, то обнаружите, что он ссылается на класс book: class librarian
{ public: void change_catalog(book *, char *); char *get_catalog(book); };
Поскольку вы не можете поставить определение класса book перед определением класса librarian, C++ позволяет вам объявить класс book, тем самым сообщая компилятору, что такой класс есть, а позже определить его. Ниже показано, как это сделать:
class book; // объявление класса
Следующая программа использует дружественные функции для ограничения доступа класса librarian к частным данным класса book. Обратите внимание на порядок определения классов: #include <iostream> #include <string> #include <conio> using namespace std; class book; class librarian { public: void change_catalog(book *, char *); char *get_catalog(book); }; class book { public: book(char *, char *, char *); void show_book (void); friend char *librarian::get_catalog(book); friend void librarian::change_catalog(book *, char *); private: char title[64]; char author[64]; char catalog[64]; }; book::book(char *title, char *author, char *catalog) { strcpy(book::title, title); strcpy(book::author, author); strcpy(book::catalog, catalog); } void book::show_book(void) { cout << "Title: " << title << endl; cout << "Autor: " << author << endl; cout << "Catalog: " << catalog << endl; } void librarian::change_catalog(book *this_book, char *new_catalog) { strcpy(this_book->catalog, new_catalog); } char *librarian::get_catalog(book this_book) { return(this_book.catalog); } void main(void) { book programming("C++", "Jamsa", "P101"); librarian library; programming.show_book(); library.change_catalog(&programming, "C++ 101"); programming.show_book(); getch(); } Как видите, программа сначала использует объявление, чтобы сообщить компилятору, что класс book будет определен позже. Поскольку объявление извещает компилятор о классе book, определение класса librarian может ссылаться на класс book, который еще не определен в программе.
ВЫВОДЫ: · Использование в программах на C++ друзей позволяет одному классу обращаться к частным элементам другого класса напрямую, используя оператор точку. · Для объявления одного класса другом (friend) другого класса вы должны внутри определения этого другого класса указать ключевое слово friend, за которым следует имя первого класса. · После объявления класса другом по отношению к другому классу, все функции-элементы класса-друга могут обращаться к частным элементам этого другого класса. · Чтобы ограничить количество дружественных методов, которые могут обращаться к частным данным класса, C++ позволяет указать дружественные функции. Для объявления функции-друга вы должны указать ключевое слово friend, за которым следует прототип функции, которой, собственно, и необходимо обращаться к частным элементам класса. · При объявлении дружественных функций вы можете получить синтаксические ошибки, если неверен порядок определений классов. Если необходимо сообщить компилятору, что идентификатор представляет имя класса, который программа определит позже, вы можете использовать оператор такого вида class class_name;.
|