Включить библиотеку std в заголовок или cpp? - PullRequest
18 голосов
/ 12 октября 2011

Если у меня есть класс A, который использует iostream, я должен поместить оператор включения iostream в A.h или A.cpp?

Ответы [ 5 ]

25 голосов
/ 12 октября 2011

Это область некоторого противоречия. Я предпочитаю, чтобы каждый заголовок был автономным, поэтому, если ему нужны другие заголовки, он включает их. Другими словами, если клиентский код должен будет включать <iostream> (или что-то еще) в любом случае, ваш заголовок должен обрабатывать это для них. OTOH, если пользователь iostream строго скрыт, поэтому клиентскому коду вообще не нужно его включать, то он должен быть включен только в файл реализации.

Во многих случаях (особенно когда заголовок открыт для частых изменений), вы бы предпочли не включать его в заголовок. В таких случаях идиома PImpl может быть полезна для получения зависимости из заголовка.

Если вам нужно включить <iostream>, сделайте одолжение своим клиентам и подумайте, можете ли вы хотя бы #include <iosfwd> вместо <iostream>. Это может улучшить время компиляции изрядной суммы.

3 голосов
/ 12 октября 2011

Включите его, где это необходимо. Если вы используете что-то определенное в <iostream> в объявлении класса (например, переменную-член, параметр функции-члена или тип возвращаемого значения и т. Д.), То это должно быть в файле H. Если вы используете его только при реализации - тогда в CPP.

2 голосов
/ 12 октября 2011

Включить его в cpp. Таким образом, он потенциально не включается в другие файлы cpp, которые могут включать ваш A.h, но не нуждаются в iostream. Если, конечно, по какой-то причине в вашем заголовочном файле есть что-то, что требует iostream. Но если это так, возможно, вы делаете что-то не так ...

1 голос
/ 12 октября 2011

Это зависит.

Если вы используете классы в заголовочном файле, вам нужно это в заголовочном файле (очевидно).

Если вы просто используетеобъявления класса вы можете использовать неполные типы.В этом случае включите <iosfwd> в заголовочный файл и <iostream> в cpp

0 голосов
/ 12 октября 2011

Используйте его там, где это необходимо.

Если ваша декларация класса ссылается на типы в заголовке, вам нужно будет включить их туда. Если это только в реализации, вы можете включить его в файл cpp.

...