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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.69
FanOfGun
6 / 6 / 1
Регистрация: 13.10.2012
Сообщений: 101
#1

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

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

все знакомые мне ide разделяют класс на два файла: .h с описанием и .cpp с кодом, но, например, в boost .hpp файлы почти всегда содержат и реализацию классов, т.е. так тоже можно. так в чем тогда разница и когда какой способ нужно применять? заранее благодарен
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2013, 21:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос реализация класса в .h файле хорошо или плохо? (C++):

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

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

Переменные на русском языке - хорошо или плохо? - C++
в mvs 2012 заметил возможность в проектах c++ переменным, функциям, классам давать русско-буквенные имена. как вы относитесь к...

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

Реализация класса в отдельном файле - C++
Изучаю C++ (вернее только начал) по учебнику "Харви М. Дейтел, Пол Дж. Дейтел - Как программировать на C++" и застрял на создании классов в...

Реализация шаблонов класса в инлайн файле - C++
Пытался написать шаблонны MyClass.h #pragma once #define MYCLASS template <typename T> class MyClass { public:

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

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

Писать реализацию в .h файл необходимо только для inline методов или шаблонов, остальное - дурной тон.
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 22:56 #10
Цитата Сообщение от FanOfGun Посмотреть сообщение
castaway, если изменить хеадер -- нужно перекомпилировать весть код, включающий его, а при реализации класса в хедере любое изменение логики будет приводить к перекомпиляции
если логика отдельно от описания, нужно перекомпилировать только ее
Давай я повторюсь и заодно открою для тебя один секрет - изменение любого кода в любом исходном файле (в том числе не заголовочном файле) влечет за собой такие же последствия. За это тебе ставлю минус.
0
Croessmah
Эксперт CЭксперт С++
13508 / 7666 / 866
Регистрация: 27.09.2012
Сообщений: 18,863
Записей в блоге: 3
Завершенные тесты: 1
17.08.2013, 22:58 #11
Цитата Сообщение от castaway Посмотреть сообщение
влечет за собой такие же последствия.
Скорее всего перекомпилируется только измененная часть + все зависимости, остальное просто останется не тронутым, а дальше работа линкера
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 23:03 #12
bumbaram, это один небольшой минус, об этом я упомянул. Тоже -
Цитата Сообщение от castaway Посмотреть сообщение
Если класс небольшой, ...
Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Скорее всего перекомпилируется только измененная часть + все зависимости, остальное просто останется не тронутым, а дальше работа линкера
Не правильно понял мысль, которую мне хотели донести. Опять же, кто читал внимательно:
Цитата Сообщение от castaway Посмотреть сообщение
Если класс небольшой, ...
Тут есть причины не "разделять класс".
0
FanOfGun
6 / 6 / 1
Регистрация: 13.10.2012
Сообщений: 101
17.08.2013, 23:05  [ТС] #13
Цитата Сообщение от castaway Посмотреть сообщение
Давай я повторюсь и заодно открою для тебя один секрет - изменение любого кода в любом исходном файле (в том числе не заголовочном файле) влечет за собой такие же последствия. За это тебе ставлю минус.
я, конечно, только начал с С++ работать, но все .cpp файлы компилируются в .o(или .obj или еще какие) файлы, этот процесс и занимает большую часть времени, после чего они линкуются в один исполняемый файл(быстро), и если изменяется один .cpp, нужно перекомпилировать только один .o файл, если меняется 10 .cpp -- 10 .o файлов. вот и вся математика. это работает в gcc, и скорей всего, во всех остальных

Добавлено через 1 минуту
а изменение .h файла влечет за собой изменеие всех .h и .cpp файлов, которые его включают, правильно ведь пишу?
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.08.2013, 23:08 #14
какая разница, большой класс или нет. если правится реализация, котрая в h файле - то тут перекомпиляция всего, что включает этот файл прямо или косвенно. хотя этого могло и не быть, если бы реализация была в cpp. так же, правится может приватная часть. сигнатуры, мемберы. последствия те же.
0
Uzer5
4 / 4 / 1
Регистрация: 22.09.2012
Сообщений: 11
17.08.2013, 23:24 #15
Цитата Сообщение от FanOfGun Посмотреть сообщение
Jupiter, т.е. если класс исключительно для себя(и 100% в будущем не будет выноситься в отдельную библиотеку) можно кидать реализацию прямо в хедер(я, как человек, пишущий в осносном на c#, был бы очень рад такой возможности) без особых проблем в будущем?
Вообще, можно программирование сравнить с кулинарией: если делаешь для всех, то надо стараться придерживаться рецепта, а если для себя, то хоть селёдку в оливье нареж и пивком залей, ктож осудит?
0
17.08.2013, 23:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2013, 23:24
Привет! Вот еще темы с ответами:

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

Можно ли Хорошо посмотреть информацию о графическом файле в разных библиотеках? - C++
Есть имя (понятно с правильным путем, но это неважно). Надо узнать Размер этого графического файла. Разумеется можно файл Прочесть и для...

Реализация класса на базе класса Stack с возможностью !индексирования! - C++
Помогите пожалуйста!!! Нужно реализовать на базе класса stack другой класс с возможностью индексирования, а именно: Например 1 - й...

Перегрузка оператора индексации для класса плохо себя ведёт - C++
Собственно, есть такое дело. #include <iostream> #include <stdio.h> #include <vector> #include <string> using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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