Подтвердить что ты не робот

Включить библиотеку std в заголовок или cpp?

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

4b9b3361

Ответ 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.