Категория: C++ энциклопедия » Д
  • 0

13 дек 2011

Автор: admin

Любой класс может объявить что-нибудь своим другом (friend). Друзья компилируются обычным образом, за исключением того, что все защищенные и закрытые члены дружественного класса видны так, словно друг является функцией этого класса. Друзьями можно объявлять функции — как
глобальные, так и члены классов. Классы тоже могут объявляться друзьями других классов; в этом случае во всех функциях класса-друга «видны» все члены того класса, другом которого он является.

class Foo; 
class BarBar {
public:
int F n(Foo*);
};
class Foo {
friend void GlobalFn();   // Д ружественные глобальные функции
friend class Bar;        // Дружественный класс
friend int BarBar::Fn(Foo*);  // Дружественная функция класса
friend class DoesNotExist;    // См. Ниже
private:
int x;
struct L istNode {  
  ListNode* n ext;
  void* d atum;
    ListNode() : next(NULL), datum(NULL) {}
} h ead;
protected:
int y;
public:
void G ();
};
void GlobalFn()
{
  Foo* f = new Foo;
  f->x = 17;    // Разрешается из-за дружеских отношений
}
class Bar {
private:
Foo* f;
public:
  Bar() : f(new Foo) {}
void W alkList();
};
void Bar::WalkList()
{
  Foo::ListNode* n = f->head.next;
  for (; n != NULL; n = n->next)
    cout << n->datum << endl;
}
int BarBar::Fn(Foo* f)
{
return f ->x;
}


Друзей принято объявлять сначала, перед членами класса и перед ключевыми словами public, protected и private. Это объясняется тем, что на друзей не действуют обычные атрибуты видимости; нечто либо является другом, либо не является. Весь фрагмент программы после определения класса Foo вполне допустим. Друзья имеют доступ ко всем членам Foo, включая закрытые. В этом примере есть одна действительно интересная строка — та, в которой другом объяв-ляется несуществующий класс DoesNotExist. Как ни странно, она не вызовет ни предупреждения, ни ошибки компилятора. Объявления друзей игнорируются на момент компиляции Foo. Они используются лишь тогда, когда будет компилироваться друг. Даже когда друга не существует, компилятор остается в счастливом неведении.
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.