Функция NonTemplate Друг шаблона класса - PullRequest
0 голосов
/ 05 апреля 2011

На Липпмане р656 я прочитал:

Не шаблонная функция или класс может быть другом шаблона класса:

template<class Type> class Bar {
    friend class Foobar;
    friend void fcn();
}; 

Интересно, что все это значит. Если fcn стал другом, то вы хотите, чтобы он получил доступ к закрытым членам Bar, но как он может получить к ним доступ, если у него нет объекта Bar, переданного в качестве параметра?

Может кто-нибудь, пожалуйста, просветите меня об этом?

Ответы [ 2 ]

5 голосов
/ 05 апреля 2011

Быть friend класса X означает, что друг (будь то функция или класс) имеет доступ ко всем закрытым и защищенным членам класса X.

В вашем примерекласс Foobar и функция fcn имеют доступ к закрытым и защищенным членам класса Bar.

Теперь вопрос:

как он может получить к ним доступэто если не получило никакого объекта Bar, переданного в качестве параметра?

Ну, он может получить доступ, если у него есть экземпляр Bar.Например.

void fcn()
{
   Bar<int> bar;
   bar.PrivateFun(); //okay even if PrivateFun is a private function of Bar
   bar.PrivateData = 10; //okay even if PrivateData is a private data of Bar
}

Чтобы подчеркнуть разницу, рассмотрим следующую функцию:

void g()
{
   Bar<int> bar;
   bar.PrivateFun(); //compilation error - g() is not a friend of Bar!
   bar.PrivateData = 10; //compilation error - g() is not a friend of Bar!
}

Надеюсь, это поможет вам понять, что значит иметь доступ к закрытым членам класса,и что значит быть friend класса!

0 голосов
/ 05 апреля 2011

Возможно, существует глобальный Bar<T>, к которому он может получить доступ - просто потому, что нет очевидного параметра, не означает, что он не может получить доступ к Bar<T>. Кроме того, это неправильно сформированный синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...