Язык программирования C++

         

Объявление friend


Предположим, мы хотим в дополнение к интерфейсу класса String создать функцию, которая формирует новую строку, являющуюся результатом слияния двух строк, но не изменяет сами аргументы. (Особенно часто подобный интерфейс необходимо создавать при определении операций – см. ниже). Для того чтобы эта функция работала быстро, желательно, чтобы она имела доступ к внутренним атрибутам класса String. Доступ можно разрешить, объявив функцию "другом" класса String с помощью ключевого слова friend:

class String { . . . friend String concat(const String& s1, const String& s2); };

Тогда функция concat может быть реализована следующим образом:

String concat(const String& s1, const String& s2) { String result; result.length = s1.length + s2.length; result.str = new char[result.length + 1]; if (result.str == 0) { // обработка ошибки } strcpy(result.str, s1.str); strcat(result.str, s2.str); return result; }

С помощью механизма friend можно разрешить обращение к внутренним элементам класса как отдельной функции, отдельному методу другого класса или всем методам другого класса:

class String { // все методы класса StringParser обладают // правом доступа ко всем атрибутам класса // String friend class StringParser; // из класса Lexer только метод CharCounter // может обращаться к внутренним атрибутам // String friend int Lexer::CharCounter(const String& s, char c); };

Конечно, злоупотреблять механизмом friend не следует. Каждое решение по использованию friend должно быть продумано. Если только одному методу какого-либо класса действительно необходим доступ, не следует объявлять весь класс как friend.



Содержание  Назад  Вперед







Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий