#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
и т. Д.