Геттеры предназначены для выбросов класса, скажем, Exhaust Car.emit()
, где автомобиль только что создал Exhaust
.
Если вы обязаны написать const Seat& Car.get_front_seat()
, чтобы потом сидеть в Driver
, вы сразу можете заметить, что что-то не так.
Правильно, вы бы лучше написали Car.get_in_driver(Driver)
, который затем вызывает напрямую seat.sit_into(Driver)
.
Этот второй метод позволяет легко избежать тех неловких ситуаций, когда вы get_front_seat
закрываете дверь, и вы фактически толкаете водителя через закрытую дверь.Помните, вы только попросили место!:)
В целом: всегда возвращайте по значению (и полагайтесь на оптимизацию возвращаемого значения) или понимайте, что пришло время изменить свой дизайн.
Фон: классы были созданы таким образом, чтобы данные можно было связать вместе с их функциями доступа, локализацией ошибок и т. Д. Таким образом, классы никогда не являются активностью, а ориентированы на данные.
Дальнейшие ловушки: в c ++, если вы возвращаете что-то с помощью const ref, то вы можете легко забыть, что это всего лишь ссылка, и как только ваш объект будет уничтожен, у вас может остаться неверный ref.В противном случае этот объект будет скопирован , как только он все равно покинет получатель.Но компилятор избегает ненужных копий, см. Оптимизация возвращаемого значения .