Если у меня есть класс A, который использует iostream, должен ли я включать оператор iostream в A.h или A.cpp?
Включить библиотеку std в заголовок или cpp?
Ответ 1
Это область некоторых разногласий. Мое собственное предпочтение состоит в том, что каждый заголовок должен быть в состоянии стоять один, поэтому, если ему нужны другие заголовки, он включает их. Другими словами, если клиентский код должен будет включать <iostream>
(или что-то еще), ваш заголовок должен обработать это для них. OTOH, если пользователь iostream строго скрыт, поэтому клиентский код вообще не должен включать его, тогда он должен быть включен только в файл реализации.
Во многих случаях (особенно если заголовок открыт для частого изменения), вы бы предпочли не включать его в заголовок. В таких случаях идиома PImpl может быть полезна для получения зависимости от заголовка.
Если вам нужно включить <iostream>
, обратитесь за помощью к своим клиентам и подумайте, можете ли вы #include <iosfwd>
вместо <iostream>
. Это может значительно сократить время компиляции.
Ответ 2
Включите его там, где это необходимо. Если вы используете что-то, определенное в <iostream>
в объявлении класса (например, переменная-член, параметр функции-члена или тип возвращаемого значения и т.д.), То она должна быть в файле H. Если вы используете его только в реализации, то в CPP.
Ответ 3
Включите его в cpp. Таким образом, он не может быть включен в другие файлы cpp, которые могут включать ваш A.h, но не нуждаются в iostream. Если, конечно, по какой-то причине в вашем файле заголовка есть что-то, что нужно iostream. Но если это дело, вы можете сделать что-то еще неправильно...
Ответ 4
Это зависит.
Если вы используете классы в файле заголовка, вам это нужно в файле заголовка (очевидно).
Если вы просто используете объявления классов, вы можете использовать неполные типы. В этом случае включите <iosfwd>
в свой файл заголовка и <iostream>
в cpp
Ответ 5
Используйте его там, где это необходимо.
Если в заголовке ссылаются ссылки на объявление класса, вы должны включить его там. Если это только в реализации, то вы можете включить его в файл cpp.