Какой смысл передавать ввод-вывод в качестве параметров?

#c

#c

Вопрос:

Я изучаю C Primer, пятое издание; и я все еще не понимаю, какой смысл передавать ссылку на поток в Sales_data классе

 Sales_data(std::istream amp;is)
 

Зачем это делать, если вы можете просто использовать std::cout и std::cin явно?

Комментарии:

1. Чтобы вы могли передавать другие виды потоков, такие как ifstream s.

2. cout это не единственный выходной поток. Что делать, если вы хотите отправить данные в файл или на принтер?

3. Примечание: потоки не могут быть скопированы. Это заставляет вас передавать их по какой-то ссылке.

Ответ №1:

Вам не нужно переходить std::cin к такой функции. Вы также можете передать std::ifstream для чтения из файла или std::istringstream для чтения из строки и так далее.

Комментарии:

1. Понятно. Итак, если это так, как можно определить, являются ли переданные аргументы std::ifstream или std::istringstream или просто стандартными std::cin / std::cout если они отличаются функционально, так есть ли способ это обнаружить? или лучше использовать std::ifstream явно в качестве параметров, если вы этого хотите? или обнаружение не имеет значения?

2. @RenzAguirre, в идеале это не должно иметь значения. Вы можете реализовать свою функцию так, чтобы это не имело значения.

3. @RSahu Попытка определить, какой поток у вас есть, пахнет плохим дизайном. Вы можете сделать это с помощью typeid или dynamic_cast , да, но для этого почти никогда не бывает веской причины.

Ответ №2:

Зачем это делать, если вы можете просто использовать std::cout и std::cin явно?

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

Когда вы создаете std::istream объект в качестве входного аргумента функции, функция становится гибкой. Вызывающие функции могут решить, хотят ли они считывать данные, из которых могут поступать std::cin , a std::ifstream , a std::istringstream и т. Д.