Нужно ли использовать аксессоры в функции друга?

вот класс

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. Разве мы не можем получить доступ к имени, написав «это-> имя»? Спасибо за ответы.

1

Решение

Необходимо нет, рекомендуется да. На самом деле нет необходимости заявлять friend вообще, который более инкапсулирован.

4

Другие решения

Это, вероятно, не столько «не могу», сколько «не должен». В этот момент времени getID() просто возвращает базовую переменную, но нет гарантии, что она не изменится на другое представление. Соблюдайте инкапсуляцию, когда вы сталкиваетесь с этим.

3

Вы можете сделать это (получить доступ к закрытым членам напрямую через функцию друга), но это не лучший способ сделать что-то. Используйте функции инспектора, потому что они должны быть написаны для предоставления приватного состояния класса таким образом, что класс написан, чтобы использовать их внешне. Фактические частные поля есть для класса использовать себя, чтобы делать то, что ему нужно делать внутри.

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

0

Нет, друг действительно является расширенной частью реализации вашего класса и поэтому имеет прямой доступ к нему.

Если вы объявили функцию или класс в качестве друга, который не является частью деталей его реализации, это, вероятно, плохое использование друга.

В вашем случае вы действительно можете полностью удалить перегрузку потокового друга, однако, если вы решили, что ваш класс также будет поддерживать потоковую передачу, и не хотите также поддерживать сеттер-функции (или обмен), у вас останется единственная оставшаяся опция иметь ваш поток в качестве друга, пишущего непосредственно в переменные-члены.

(Обратите внимание, что при входе в поток, если это не удается, объект должен оставаться в состоянии по умолчанию (только что создан).

Поток-выход должен быть другом, когда (и, предпочтительно, только когда) он должен записывать элементы потока, к которым вы обычно не предоставляете прямой доступ.

0
По вопросам рекламы [email protected]