вот класс
class Instructor
{
public:
Instructor ( int id , string name ) ;// constructor
~Instructor () ;
// methods
string getName () ;
int getID () ;private:
int id ;
string name ;
friend ostream & operator<< ( ostream & out , Instructor & instructor ) ;
} ;
вот функция ostream
ostream & operator<< ( ostream & out , Instructor & instructor )
{
out << "ID:" << instructor.getID() << "\t NAME:" << instructor.getName() << "\t OFFERED_COURSES:" ;return out << endl ;
}
а вот методы getname и getID
string Instructor::getName ()
{
return this->name ;
}int Instructor::getID ()
{
return this->id ;
}
и мой вопрос, почему мы должны использовать функции getID и getname. Разве мы не можем получить доступ к имени, написав «это-> имя»? Спасибо за ответы.
Необходимо нет, рекомендуется да. На самом деле нет необходимости заявлять friend
вообще, который более инкапсулирован.
Это, вероятно, не столько «не могу», сколько «не должен». В этот момент времени getID()
просто возвращает базовую переменную, но нет гарантии, что она не изменится на другое представление. Соблюдайте инкапсуляцию, когда вы сталкиваетесь с этим.
Вы можете сделать это (получить доступ к закрытым членам напрямую через функцию друга), но это не лучший способ сделать что-то. Используйте функции инспектора, потому что они должны быть написаны для предоставления приватного состояния класса таким образом, что класс написан, чтобы использовать их внешне. Фактические частные поля есть для класса использовать себя, чтобы делать то, что ему нужно делать внутри.
Поскольку вы не используете закрытых членов в своей функции оператора, вам даже не нужно быть другом.
Нет, друг действительно является расширенной частью реализации вашего класса и поэтому имеет прямой доступ к нему.
Если вы объявили функцию или класс в качестве друга, который не является частью деталей его реализации, это, вероятно, плохое использование друга.
В вашем случае вы действительно можете полностью удалить перегрузку потокового друга, однако, если вы решили, что ваш класс также будет поддерживать потоковую передачу, и не хотите также поддерживать сеттер-функции (или обмен), у вас останется единственная оставшаяся опция иметь ваш поток в качестве друга, пишущего непосредственно в переменные-члены.
(Обратите внимание, что при входе в поток, если это не удается, объект должен оставаться в состоянии по умолчанию (только что создан).
Поток-выход должен быть другом, когда (и, предпочтительно, только когда) он должен записывать элементы потока, к которым вы обычно не предоставляете прямой доступ.