Опубликован: 26.06.2003 | Уровень: для всех | Доступ: платный
Лекция 11:

Контроль доступа к объекту

< Лекция 10 || Лекция 11: 123 || Лекция 12 >

Объявление 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.

< Лекция 10 || Лекция 11: 123 || Лекция 12 >
Андрей Одегов
Андрей Одегов
Язык программирования C++
Елена Шумова
Елена Шумова

Здравствуйте! Я у Вас прошла курс Язык программировая Си++.

Заказала сертификат. Хочу изменить способ оплаты. Как это сделать?

Евгений Медведев
Евгений Медведев
Россия, Кемерово, КузГТУ