iostream header против класса iostream - PullRequest
4 голосов
/ 19 апреля 2011

Если существует файл foo.cpp, то он обычно имеет связанный заголовочный файл foo.h со всеми объявлениями для функций, определенных в foo.cpp. Таким образом, все остальные файлы, которые используют функции в foo.cpp, могут просто включать файл foo.h и использовать их. Вот мое простое понимание заголовочных файлов.


Однако я не вижу такой связи между заголовочным файлом iostream и классом iostream. Заголовочный файл iostream объявляет только несколько внешних переменных, но, похоже, ни одна из них не имеет никакого отношения к классу iostream напрямую. Класс iostream также, похоже, не объявляет никаких новых функций. Почему тогда у нас есть класс iostream и заголовочные файлы iostream? Извиняюсь, если я звучу смущенным, но это действительно смущает меня.

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

Отношение между заголовками и классами не обязательно однозначное;Это простое правило, которому часто учат начинающие программисты.Фактически, стандарт языка C ++ не устанавливает какой-либо прямой связи между классами, файлами реализации ( единицы перевода ) и заголовками, и стандартная библиотека часто отклоняется от этого правила.1005 * - это typedef для шаблона класса std::basic_iostream (в частности, для basic_iostream<char>).На моей платформе <iostream> включает <istream>, который определяет basic_iostream, а также <iosfwd>, который содержит typedef.

0 голосов
/ 19 апреля 2011

Шаблоны - это особый случай, и у вас могут возникнуть проблемы, если вы объявите шаблонный класс или функцию и определите ее в другом файле. Поскольку компиляторы C ++ могут компилировать только экземпляры шаблонных элементов (например, std::vector<int>), а не их универсальные версии (это было бы std::vector<T>), необходимо, чтобы универсальная версия была доступна везде, где делается экземпляр. Следовательно, реализация универсального класса обычно находится в его заголовочном файле.

...