Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
#1

Как правильно включать хедеры? - C++

20.11.2011, 00:33. Просмотров 1569. Ответов 25
Метки нет (Все метки)

Допустим, программа разбита на три исходника:
main.cpp - тут лежит main
abc.h - тут объявлен класс abc
abc.cpp - тут определены методы этого класса

Вопрос: куда стилистически корректнее включать хедеры? Все записать в abc.h, а в остальные файлы включать только его? Или в каждый исходник включать необходимый для него хедер, при том, что тот же iostream понадобится и в мэйне и в определениях методов? Или как-то иначе?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2011, 00:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно включать хедеры? (C++):

хедеры - C++
чем отличаются хедеры написаные <вот_так.h> от "такиих.h" ?

Хедеры в поддиректориях CodeBlocks - C++
Добрый день! Пытаюсь подключить к CodeBlocks на Ubuntu хедеры для GTK. Выбираю Settings->Compiler->Search Directories и прописываю туда...

Хедеры в Code Blocks - C++
До этого сидел в студии 10ой, сейчас скачал Code Blocks, настроил компилятор, проблема в том, что когда создаю класс, компилятор не видит...

Как правильно вписать функцию в h-файл и правильно её отразить в основной функции? - C++
Создать внешнюю библиотеку, в которой написана функция вывода символьного массива обратном порядке. Подключить данную библиотеку к ...

Как правильно унаследовать TPoint2D от TPoint3D/ Правильно ли наследовать? ООП - C++
Два пользовательских класса: Точка в 2D пространстве и точка в 3D пространстве. class TPoint3D{ int X,Y,Z; public: ...

Зачем включать <iostream> и <stdio.h> одновременно? - C++
Не первый раз встречаю такой код: #include &lt;stdio.h&gt; #include &lt;iostream&gt; В этом что, есть какой-то сакральный смысл?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
prZzZ
Программист
112 / 92 / 5
Регистрация: 22.03.2011
Сообщений: 235
20.11.2011, 00:38 #2
Svinina, Здравствуйте...
В общем хидер включается там где он нужен...
Ну, а что касается отдельных библиотек, к примеру таких как MFC, то они диктуют свои правила...
Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
20.11.2011, 00:44  [ТС] #3
prZzZ, хорошо, ну а из моего примера <iostream> лучше в abc.h или в abc.cpp включить?
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
20.11.2011, 00:54 #4
Svinina, лучше включать заголовки только в те файлы, в которых они используются. Если в файле "abc.h" не упоминается ничего из заголовка <iostream>, то какой смысл его туда включать?
prZzZ
Программист
112 / 92 / 5
Регистрация: 22.03.2011
Сообщений: 235
20.11.2011, 00:57 #5
Svinina, лучше, конечно в abc.cpp, но это при том условии, если вы используете iostream для внутренних манипуляций, - в противном случае - если у вас методы принимают или отдают параметры iostream или у вас утилиты класса iostream или друзья и или online и т.д. - объявляете в abc.h
alkagolik
Заблокирован
20.11.2011, 05:27 #6
Svinina, а еще лучше скомпилировать abc.h и abc.cpp в статическую библиотеку, abc.a, подключить abc.h в main.cpp и компилировать с библиотекой abc.a.
Bers
Заблокирован
20.11.2011, 06:56 #7
Цитата Сообщение от alkagolik Посмотреть сообщение
Svinina, а еще лучше скомпилировать abc.h и abc.cpp в статическую библиотеку, abc.a, подключить abc.h в main.cpp и компилировать с библиотекой abc.a.
Ага, что бы тут же начать ловить проблемы с оптимизаций, с конфликтами дебаг/релиз версий, с различиями между настройками компилятора целевого проекта и либы. Да?

И все эти телодвижения только ради того, что бы однократно не включать ручками abc.cpp

Абалденный подход !
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
20.11.2011, 11:33 #8
Цитата Сообщение от Svinina Посмотреть сообщение
abc.h - тут объявлен класс abc
abc.cpp - тут определены методы этого класса
в abc.h можно просто скопировать структуры и классы(без статистических библиотек ) из других хейдеров
в abc.cpp можно просто вручную объявить extern нужные функция и скопировать нужные структуры и классы
Bers
Заблокирован
20.11.2011, 12:16 #9
Цитата Сообщение от Van111 Посмотреть сообщение
в abc.h можно просто скопировать структуры и классы(без статистических библиотек ) из других хейдеров
Зачем в один хэдер копипастить что-то из других хэдэров?
Когда можно тупо приинклюдить.


Цитата Сообщение от Van111 Посмотреть сообщение
в abc.cpp можно просто вручную объявить extern нужные функция и скопировать нужные структуры и классы
А это зачем вообще может быть нужно?
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
20.11.2011, 12:48 #10
Цитата Сообщение от Bers Посмотреть сообщение
А это зачем вообще может быть нужно?
Цитата Сообщение от Bers Посмотреть сообщение
Зачем в один хэдер копипастить что-то из других хэдэров?
Когда можно тупо приинклюдить.
чтоб уменьшить объём
Bers
Заблокирован
20.11.2011, 12:50 #11
Цитата Сообщение от Van111 Посмотреть сообщение
чтоб уменьшить объём
Каким образом копипаста может уменьшить объем?
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
20.11.2011, 14:32 #12
Цитата Сообщение от prZzZ Посмотреть сообщение
в противном случае - если у вас методы принимают или отдают параметры iostream или у вас утилиты класса iostream или друзья и или online и т.д. - объявляете в abc.h
Можно использовать предварительную декларацию классов.
alkagolik
Заблокирован
20.11.2011, 16:45 #13
Цитата Сообщение от Bers Посмотреть сообщение
Ага, что бы тут же начать ловить проблемы с оптимизаций, с конфликтами дебаг/релиз версий, с различиями между настройками компилятора целевого проекта и либы. Да?
И все эти телодвижения только ради того, что бы однократно не включать ручками abc.cpp
Абалденный подход !
а вы включаете ручками new.cpp, cout.cpp, iterator_begin.cpp... (имена условные) ? Вы об их существовании даже не задумываетесь, потому что все они собраны в библиотеки.
fasked
20.11.2011, 16:52
  #14

Не по теме:

Цитата Сообщение от alkagolik Посмотреть сообщение
а вы включаете ручками new.cpp, cout.cpp, iterator_begin.cpp... (имена условные) ? Вы об их существовании даже не задумываетесь, потому что все они собраны в библиотеки.
Спасибо, поржал

Bers
Заблокирован
20.11.2011, 17:04 #15
Цитата Сообщение от alkagolik Посмотреть сообщение
а вы включаете ручками new.cpp, cout.cpp, iterator_begin.cpp... (имена условные) ? Вы об их существовании даже не задумываетесь, потому что все они собраны в библиотеки.
А вы уверены, что озвученные файлы вообще существуют?
Я сделаю вам прозрачный намек: стандартная библиотека шаблонов чуть меньше чем полностью реализована на шаблонах. Которым не нужны *.cpp

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

В то время, как в целевом проекте вы будите лазить по всей его архитектуре сверху донизу и обратно, по 100500 раз меняя то одно, то другое, то третье.

А ловить баги, и вносить изменения в уже скомпилированном коде, в котором нельзя просто так пошариться - это очень, очень, очень мега неудобно.

Одно дело цеплять к проекту уже протестированную и отлаженную библиотеку, в которую в принципе никаких изменений никто уже вносить не будит. И совсем другое - прицеплять скомпилированные части собственного проекта, а потом афигиевать от привалившей кучи "удобств".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2011, 17:04
Привет! Вот еще темы с ответами:

В каких случаях необходимо включать include string - C++
В каких случаях необходимо использовать инструкцию препроцессора #include &lt;string&gt;? Раньше я думал, что это необходимо всякий раз, как я...

Написать программу, которая должна включать функции - C++ - C++
Задача Написать программу, которая должна включать функции для: - Ввод и вывод данных массива структур, - Выборки информации по...

Создайте новую програму, которая будет включать класс fraction - C++
Создайте новую програму, которая будет включать класс fraction, созданные в Том упражнении. ...

Почему у меня для использования функций cstring не нужно включать прототип библиотеки - C++
Я недавно начал осваивать с++ с помощью учебника и там по ходу главы создается тренировочный класс String для работы со строками и в нем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.11.2011, 17:04
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru