Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/86: Рейтинг темы: голосов - 86, средняя оценка - 4.87
6 / 6 / 4
Регистрация: 13.10.2012
Сообщений: 101

реализация класса в .h файле хорошо или плохо?

17.08.2013, 21:48. Показов 16992. Ответов 61
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
все знакомые мне ide разделяют класс на два файла: .h с описанием и .cpp с кодом, но, например, в boost .hpp файлы почти всегда содержат и реализацию классов, т.е. так тоже можно. так в чем тогда разница и когда какой способ нужно применять? заранее благодарен
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.08.2013, 21:48
Ответы с готовыми решениями:

Такой способ создание экземпляра класса хорошо или плохо?
Объясните пожалуйста в чем есть плохо создавать экземпляр класса вот так? class A{ /*.....*/ }objA; нежели так :

Многопоточность - хорошо или плохо?
Начал писать программы с многопоточностью. Имею 64х AMD 4-ядерный. Ранее думал, что на таком процессоре можно создать лишь 4 потома -...

Google: хорошо или плохо?
давайте по холливарим немного

61
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.08.2013, 21:49
Цитата Сообщение от FanOfGun Посмотреть сообщение
но, например, в boost .hpp файлы почти всегда содержат и реализацию классов
потому что в бусте в основном шаблоны

Цитата Сообщение от FanOfGun Посмотреть сообщение
так в чем тогда разница и когда какой способ нужно применять?
шаблоны и inline-функции пишут только в хедерах.
разделение на два файла позволяет скрыть реализацию предоставив "клиентам" лишь интерфейс (хедер файл с прототипами) и бинарник (dll/lib/so/a...).
2
6 / 6 / 4
Регистрация: 13.10.2012
Сообщений: 101
17.08.2013, 21:57  [ТС]
Jupiter, т.е. если класс исключительно для себя(и 100% в будущем не будет выноситься в отдельную библиотеку) можно кидать реализацию прямо в хедер(я, как человек, пишущий в осносном на c#, был бы очень рад такой возможности) без особых проблем в будущем?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.08.2013, 22:00
Цитата Сообщение от FanOfGun Посмотреть сообщение
можно кидать реализацию прямо в хедер
нет просто кидать нельзя, можно просто писать тело метода внутри класса, как в шарпе, но читать такие простыни потом неудобно, в шарпе хоть с помощью partial можно спастись
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class MyClass
{
  void foo()
  {
  ...
  }
   
  void bar()
  {
  ...
  }
  ...
};
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.08.2013, 22:13
Jupiter, извини, но я с тобой не соглашусь.
Если класс небольшой, то его лучше реализовать в одном заголовочном файле. Причины просты: проще читать/редактировать/искать ошибки, меньше файлов, меньше кода (нет прототипов, нет forward declaration).
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
17.08.2013, 22:33
нет прототипов, нет forward declaration
ага. и больше зависимостей. не сталкивались с проектами, где какое-то микроизменение в одном файле приводит к нескольким часам ребилда из-за такого подхода?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.08.2013, 22:44
Цитата Сообщение от DU Посмотреть сообщение
и больше зависимостей.
С какой стати их стало больше?
Цитата Сообщение от DU Посмотреть сообщение
не сталкивались с проектами, где какое-то микроизменение в одном файле приводит к нескольким часам ребилда из-за такого подхода?
Сталкивался. Это изменение относится не только к классу реализованному одним заголовочным файлом, это изменение относится ко всем исходным файлам проекта. Поэтому вообще не понятно к чему вы это сказали.
1
6 / 6 / 4
Регистрация: 13.10.2012
Сообщений: 101
17.08.2013, 22:49  [ТС]
castaway, если изменить хеадер -- нужно перекомпилировать весть код, включающий его, а при реализации класса в хедере любое изменение логики будет приводить к перекомпиляции
если логика отдельно от описания, нужно перекомпилировать только ее
0
 Аватар для bumbaram
47 / 47 / 9
Регистрация: 13.02.2012
Сообщений: 176
17.08.2013, 22:52
Цитата Сообщение от castaway Посмотреть сообщение
Сталкивался. Это изменение относится не только к классу реализованному одним заголовочным файлом, это изменение относится ко всем исходным файлам проекта. Поэтому вообще не понятно к чему вы это сказали.
Если твой класс разбит на .h и .cpp файл, то в нем явно разделены интерфейс и реализация. При этом небольшое изменение реализации требует пересборки только одного конкретного класса. При изменении .h файла, требуется пересборка всех классов в которые он был включен, а потом всех в которые были включены они и так далее...

Писать реализацию в .h файл необходимо только для inline методов или шаблонов, остальное - дурной тон.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.08.2013, 22:56
Цитата Сообщение от FanOfGun Посмотреть сообщение
castaway, если изменить хеадер -- нужно перекомпилировать весть код, включающий его, а при реализации класса в хедере любое изменение логики будет приводить к перекомпиляции
если логика отдельно от описания, нужно перекомпилировать только ее
Давай я повторюсь и заодно открою для тебя один секрет - изменение любого кода в любом исходном файле (в том числе не заголовочном файле) влечет за собой такие же последствия. За это тебе ставлю минус.
1
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
17.08.2013, 22:58
Цитата Сообщение от castaway Посмотреть сообщение
влечет за собой такие же последствия.
Скорее всего перекомпилируется только измененная часть + все зависимости, остальное просто останется не тронутым, а дальше работа линкера
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.08.2013, 23:03
bumbaram, это один небольшой минус, об этом я упомянул. Тоже -
Цитата Сообщение от castaway Посмотреть сообщение
Если класс небольшой, ...
Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Скорее всего перекомпилируется только измененная часть + все зависимости, остальное просто останется не тронутым, а дальше работа линкера
Не правильно понял мысль, которую мне хотели донести. Опять же, кто читал внимательно:
Цитата Сообщение от castaway Посмотреть сообщение
Если класс небольшой, ...
Тут есть причины не "разделять класс".
0
6 / 6 / 4
Регистрация: 13.10.2012
Сообщений: 101
17.08.2013, 23:05  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Давай я повторюсь и заодно открою для тебя один секрет - изменение любого кода в любом исходном файле (в том числе не заголовочном файле) влечет за собой такие же последствия. За это тебе ставлю минус.
я, конечно, только начал с С++ работать, но все .cpp файлы компилируются в .o(или .obj или еще какие) файлы, этот процесс и занимает большую часть времени, после чего они линкуются в один исполняемый файл(быстро), и если изменяется один .cpp, нужно перекомпилировать только один .o файл, если меняется 10 .cpp -- 10 .o файлов. вот и вся математика. это работает в gcc, и скорей всего, во всех остальных

Добавлено через 1 минуту
а изменение .h файла влечет за собой изменеие всех .h и .cpp файлов, которые его включают, правильно ведь пишу?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
17.08.2013, 23:08
какая разница, большой класс или нет. если правится реализация, котрая в h файле - то тут перекомпиляция всего, что включает этот файл прямо или косвенно. хотя этого могло и не быть, если бы реализация была в cpp. так же, правится может приватная часть. сигнатуры, мемберы. последствия те же.
0
 Аватар для Uzer5
4 / 4 / 1
Регистрация: 22.09.2012
Сообщений: 12
17.08.2013, 23:24
Цитата Сообщение от FanOfGun Посмотреть сообщение
Jupiter, т.е. если класс исключительно для себя(и 100% в будущем не будет выноситься в отдельную библиотеку) можно кидать реализацию прямо в хедер(я, как человек, пишущий в осносном на c#, был бы очень рад такой возможности) без особых проблем в будущем?
Вообще, можно программирование сравнить с кулинарией: если делаешь для всех, то надо стараться придерживаться рецепта, а если для себя, то хоть селёдку в оливье нареж и пивком залей, ктож осудит?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.08.2013, 23:27
Цитата Сообщение от Uzer5 Посмотреть сообщение
а если для себя, то хоть селёдку в оливье нареж и пивком залей, ктож осудит?
Сам потом себя и осудишь
0
17.08.2013, 23:29

Не по теме:

Цитата Сообщение от Uzer5 Посмотреть сообщение
если делаешь для всех, то надо стараться придерживаться рецепта
Скажите это в армии :D

0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.08.2013, 23:29
FanOfGun, на заметочку: почитайте про паттерн "мост".
Там тема изоляции интерфейса класса от его реализации выражена рельефно.
Что касается вопроса про разделение на h и cpp - я время от времени
переписываю свои же классы (из h в h + cpp) и тихо матерюсь: ну почему,
почему я не сделал этого сразу...
1
17.08.2013, 23:30

Не по теме:

Цитата Сообщение от Uzer5 Посмотреть сообщение
ктож осудит?
Что-то вспомнилось:
У печени бы руки были - они бы горло задушили :D

0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.08.2013, 23:33
DU, и часто случаются случаи когда надо править заголовочный файл, а реализацию в .cpp править не надо?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.08.2013, 23:33
Помогаю со студенческими работами здесь

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

Глобальные указатели. Плохо или хорошо?
Уважаемые знатоки, хотел уточнить один вопрос. Дело в том, что я использую глобальные указатели на объекты. Сами объекты создаются по...

молодняк получил пр=0 хорошо или плохо?
молодой блог ~200 статей. тематика "культура и история" в Г.Панельке словил пр морды 0, раньше не определялся. это хорошо или плохо? ну как...

Средний балл - хорошо или плохо
С клавиатуры вводятся оценки студента, объемом n, определить средний балл и вывести "хорошо", если средний балл 4 и выше, в...

Статические функции-члены - хорошо или плохо?
Всем привет. Приведу пример такой архитектуры. Есть базовый интерфейс. От него наследуются много конкретных. И есть фабрика,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru