Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Поясните, пожалуйста: для чего иногда объявление класса и его реализацию разносят по *.h и *.cpp соответственно, а иногда - все помещают в один файл (заголовка)? И - в каких случаях как лучше поступать? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 10:24 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Сохраняйте паспорт прибора в течПоясните, пожалуйста: для чего иногда объявление класса и его реализацию разносят по *.h и *.cpp соответственно, а иногда - все помещают в один файл (заголовка)? И - в каких случаях как лучше поступать? Так сразу и не объяснишь всего... Попиши года два, может придёт понимание... На самом деле это ДЕЙСТВИТЕЛЬНО очень сложный вопрос, потому что как раз это решение (в .cpp или .h) проходит по КУЧЕ trade-off ов. Их примерно штук 10-15, все перечислять ... ну нет. Поищи по FAQ-ам лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 11:48 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
MasterZiv, я в печали. :( Хотя бы парочку примеров приведите, что ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 12:08 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Header only -- весь код inline. Объём объектного кода растёт многократно. Object library -- каждый кодовый объект закодирован только один раз. Объём кода минимален. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 12:12 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Ну вот тебе нашёл в виде FAQ. https://softwareengineering.stackexchange.com/questions/305618/are-header-only-libraries-more-efficient Тут наверняка не все аспекты, но больше чем 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 12:15 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Сохраняйте паспорт прибора в течЗдравствуйте! Поясните, пожалуйста: для чего иногда объявление класса и его реализацию разносят по *.h и *.cpp соответственно, а иногда - все помещают в один файл (заголовка)? И - в каких случаях как лучше поступать? Спасибо. если кратко: то функционал разносят по тем же причинам, по которому у книги есть список глав с нумерацией и содержанием - это удобно. Когда книга большая и нужно понять есть ли в ней нужный тебе раздел ты не листаешь всю книгу, а смотришь в оглавление и сразу делаешь вывод о том, стоит ли листать ее дальше или нужно поискать другую книгу. Разбиение кода на h и cpp так же позволяет писать библитеки (dll) и скрывать их реализацию в cpp, а пользователю отдавать только описание интерфейсов в h. То есть он может знать что есть такая функция, но как она работает - не его собачье дело - она скомпилирована и спрятана в dll. Объявления из h файлов удобно подключать в другие h/cpp файлы. Таким образом у нормального разработчика поддерживается порядок среди компонентов проекта, где каждый модуль (h/cpp) отвечает за свою часть задачи и может при необходимости быть подключен к другому модулю, где необходим уже реализованный функционал. Реализацию хранят в h файлах, как правило, только когда дело касается шаблонов, т.к. это уже компиляторные заморочки при инстанциировании объектов. Захочешь узнать больше - погугли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 12:23 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Cerebrum...Захочешь узнать больше - погугли. Да гуглю я, гуглю... Cerebrum...если кратко: то функционал разносят по тем же причинам, по которому у книги есть список глав с нумерацией и содержанием - это удобно. Когда книга большая и нужно понять есть ли в ней нужный тебе раздел ты не листаешь всю книгу, а смотришь в оглавление и сразу делаешь вывод о том, стоит ли листать ее дальше или нужно поискать другую книгу... Наверное, аналогия с книгой годится для случая, когда методы реализованы прямо "в теле" класса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. - действительно, не очень удобно, согласен. Но ведь в одном файле, не разнося по разным .h и .cpp, можно и так написать: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. - тут вроде как и список глав отдельно, и все в одном файле. А редактировать в современных IDE - скорее, без разницы: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 13:12 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Товарищи монстры! Не подумайте, бога ради, что я спорю. Я - информацию собираю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 13:14 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Сохраняйте паспорт прибора в теч, общее правило - выносить в заголовочные файлы (.h файлы) то, что будет использоваться более чем в одном модуле (.c/.cpp файле). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 13:19 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Классически (стандартно) в С++ принято что в .h объявление, а в .cpp определение, т.е. код. Как уже выше написали помещение кода в .h позволяет компилятору сделать inline, в результате ускорение работы кода. Писать код только в .h не получится, т.к. не всякий код можно написать в .h ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 13:30 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Dima TПисать код только в .h не получится, т.к. не всякий код можно написать в .h Так всякий же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 13:36 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
MasterZivDima TПисать код только в .h не получится, т.к. не всякий код можно написать в .h Так всякий же. Например static поле. Код: plaintext 1. 2. 3. 4. 5. А затем #include в два разных cpp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 13:57 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
MasterZivDima TПисать код только в .h не получится, т.к. не всякий код можно написать в .h Так всякий же. Еще проблемы когда классы вызывают методы друг-друга. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 14:01 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Dima T, ИХМО рудимент, более современные языки так не поступают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 17:45 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Про шаблоны забыли! Шаблоны всегда пишутся в *.h, так как это не код, а метакод. Если писать его в *.cpp, получится несколько реализаций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2018, 05:23 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Dima TMasterZivпропущено... Так всякий же. Например static поле. Код: plaintext 1. 2. 3. 4. 5. А затем #include в два разных cpp Это -- объявление. Его ДОПУСТИМО размещать во многих единицах компиляции. Нельзя размещать только ОПРЕДЕЛЕНИЕ. Отсюда и ODR -- One Definition Rule ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2018, 12:48 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
MasterZivЭто -- объявление. Его ДОПУСТИМО размещать во многих единицах компиляции. Нельзя размещать только ОПРЕДЕЛЕНИЕ. Отсюда и ODR -- One Definition Rule Об этом я и писал 21274276 Не все можно писать в .h ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2018, 13:29 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
MasterZivDima Tпропущено... Например static поле. Код: plaintext 1. 2. 3. 4. 5. А затем #include в два разных cpp Это -- объявление. Всё, кроме `static int x;` — это определение. MasterZivЕго ДОПУСТИМО размещать во многих единицах компиляции. Нельзя размещать только ОПРЕДЕЛЕНИЕ. Отсюда и ODR -- One Definition Rule `int A::x = 0;` тоже допустимо размещать во многих единицах трансляции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2018, 13:33 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
Dima TКлассически (стандартно) в С++ принято что в .h объявление, а в .cpp определение, т.е. код. http://eel.is/c draft/basic.def#2.example-1 [ Example: All but one of the following are definitions: int a; // defines a extern const int c = 1; // defines c int f(int x) { return x+a; } // defines f and defines x struct S { int a; int b; }; // defines S, S::a, and S::b struct X { // defines X int x; // defines non-static data member x static int y; // declares static data member y X(): x(0) { } // defines a constructor of X }; int X::y = 1; // defines X::y enum { up, down }; // defines up and down namespace N { int d; } // defines N and N::d namespace N1 = N; // defines N1 X anX; // defines anX whereas these are just declarations: extern int a; // declares a extern const int c; // declares c int f(int); // declares f struct S; // declares S typedef int Int; // declares Int extern X anotherX; // declares anotherX using N::d; // declares d — end example ] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2018, 13:38 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
да, да, многие программисты даже с многолетним опытом путаются что такое объявление и определение классов, путают определение класса и определение его методов, и то что допустимы множественные определения классов.. на все это накладываются дополнительные заморочки с inline и статик.. ну и шаблоны сверху все еще более усложняют ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2018, 17:26 |
|
||
|
Определение и объявление класса
|
|||
|---|---|---|---|
|
#18+
HenocefalMasterZivпропущено... Это -- объявление. Всё, кроме `static int x;` — это определение. Именно. Это объявление. Его можно хоть 200 раз делать. HenocefalMasterZivЕго ДОПУСТИМО размещать во многих единицах компиляции. Нельзя размещать только ОПРЕДЕЛЕНИЕ. Отсюда и ODR -- One Definition Rule `int A::x = 0;` тоже допустимо размещать во многих единицах трансляции? нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2018, 00:56 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=21&tid=2017920]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 163ms |

| 0 / 0 |
