|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Расположение определения функций в заголовочных файлах14.08.2018, 23:26. Показов 2181. Ответов 17
Метки нет (Все метки)
grizlik78,
Часто вижу что приватную секцию указывают внизу, интересно, зачем? Вроде удобнее расположить приватные члены класса в самом начале ещё до того как будет указан какой либо из модификаторов доступа... Добавлено через 3 минуты mhg, Покажите место где используете экземпляр данного класса
0
|
|
| 14.08.2018, 23:26 | |
|
Ответы с готовыми решениями:
17
Странные объявления функций в заголовочных файлах Про добавление заголовочных файлов в заголовочных файлах
|
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|
| 14.08.2018, 23:27 | |
|
Удобнее в том смысле, что не надо писать ключевое слово private? Так я считаю, что его стоит писать даже если приватные члены расположены вначале. А так дело вкуса. Просто многим удобнее когда сначала идёт интерфейс класса, а потом уже закрытые детали.
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 14.08.2018, 23:37 [ТС] | |
|
grizlik78,
Да, в этом смысле Просто часто встречается, думал может кроме вкуса есть ещё какое то обоснование ![]() Ну не знаю, зачем писать в начале если и так известно что это приватная зона... По поводу интерфейса можно в принципе поделить на хедер и cpp... Кстати иногда даже сложно читать такой код... Обычно код читается сверху вниз... Если не видим полей, но в методах к ним обращаемся, приходится кутить вниз чтоб узнать что это за поле а потом опять крутить вверх что бы продолжить читать код метода... Как то не очень удобно ![]() Сори за оффтоп
0
|
|
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
|
|||
| 15.08.2018, 18:34 | |||
|
Что касается "неудобства", которые ты описываешь - оно прекрасно убирается нотациями именования членов, префиксом m_ или суффиксом _, становится прекрасно видно, что данная переменная принадлежит классу. Кроме того, если в классе столько переменных, что при разработке становится их сложно запомнить, то это звоночек по дизайну - "а не пишем ли мы класс-великий всемогутор"?Добавлено через 6 минут Добавлено через 8 минут И еще - разработка класса таки должна начинаться с интерфейса, так мы фиксируем контракт и уже можем начинать писать тесты. С этой позиции тем более выгоднее писать публичную секцию вначале.
3
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 15.08.2018, 19:07 [ТС] | |
|
DrOffset,
Да я именно говорил про тот случай когда тело методов пишется внутри класса... По поводу того что сначала идёт интерфейс - согласен, но меня печалит то что если потом инклюдить хедер, то про инлайн как правило можно забыть а это плохо сказывается на производительности... Тут можно поделить и инклюдить сам сппшник, тогда бинарник будет более пухлым. Места на диске может и не жалко, но есть мнение что это так же может влиять на производительность... Типа код не всегда целиком в памяти, и чем его больше - тем больше надо лазить в диск что бы загрузить нужный код в память... Кроме того когда делим на хедер и спп - для того что бы посмотреть поля надо прыгать в другой файл (хедер) что тоже не сильно удобно... Но есть случаи когда железно надо делить, например при использовании динамически подключаемых библиотек... Вот это я понимаю обоснование. ИМХО все остальные аргументы так себе и имеют минусы не слабее чем плюсы ![]() Да кстати, интересно что ты обо всем этом думаешь
0
|
|
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
|
||||||
| 15.08.2018, 19:31 | ||||||
|
0
|
||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||||
| 15.08.2018, 19:58 [ТС] | |||||||
![]() А в данном случае не очень понятно в чем проблема... Было бы не плохо работать в однообразном стиле... ![]() Добавлено через 7 минут Сразу внутри класса пишут
0
|
|||||||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
|
||||||
| 15.08.2018, 20:10 | ||||||
|
Вот тебе реальные цифры из недавней работы по оптимизации картографического рендера под ARM: Микропотимизации (inline, исключение лишних временных объектов, битовая магия и т.п.) - прирост производительности ~3% Алгоритмическая оптимизация - прирост производительности ~40% в тривиальнейшей реализации. ![]() Добавлено через 54 секунды
1
|
||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||
| 15.08.2018, 20:21 [ТС] | |||||
|
То есть не нужно в зависимости от ситуации писать реализацию в хедере (пусть даже в отдельном файле который туда инклюдится)... Но увы это не работает... (хотя может какой то компилятор так может, не знаю). В первую очередь хочется писать реализацию в классе для однообразности...
0
|
|||||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
|
|||
| 15.08.2018, 20:37 | |||
![]() Да и все-таки по исходному вопросу. а) Проектирование класса начинается с определения операций, которые доступны с его объектами. Это всегда публичный интерфейс (в общем смысле слова). б) Пользователям класса безразличны его приватные данные. Есть даже паттерны (pimpl), которые специально дополнительно скрывают их. Цели у них две - повышение инкапсуляции и понижение связности (1). Собственно, это основные причины, почему публичную секцию пишут вначале. Остальные вопросы, вроде стиля и т.п., второстепенны. _____ (1) например, техника pimpl в Qt позволила стабилизировать ABI и сделать его независимым от приватных данных класса. Если разработчики что-то меняют в них, то это никак не отражается на уже скомпилированных бинарниках, в пределах широкого диапазона версий.
1
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||
| 15.08.2018, 21:04 [ТС] | |||||
![]() А пользователи какой нибудь либы смотрят доки на каком нибудь сайте где есть список методов и их сигнатура... Но на уровне доков уже без разницы как оно там внутри разделено Думаю основной аргумент пимпла это все же снижение времени компиляции но как приятный побочный эффект - получается более чистый хедер ввиду отсутствия полей кроме указателя impl...В принципе основную мысль я уловил (хоть местами меня кое что не устраивает) но суть то стала более менее ясна. Спасибо ![]() Добавлено через 7 минут Добавлено через 3 минуты
0
|
|||||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
|
|||||
| 15.08.2018, 21:09 | |||||
И я на этом внимание не акцентировал.А в остальном быстро изучить исходник помогут различные доступные сейчас утилиты, не 90й год, как-никак. ![]() Добавлено через 1 минуту ![]() Естественно, компилятору обычно лучше знать, надо ли делать функцию inline или нет.
2
|
|||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 16.08.2018, 14:16 [ТС] | |
|
DrOffset,
Вот в данный момент я пишу класс который очень горячий )) Его экземпляры создаются и используются в цикле и хочется все вызовы заинлайнить вплоть до конструкторов (один шаблонный). Но когда я делю на хедер и спп то код не компилируется потому что в сппшник надо инклюдить хедер а в хедер сппшник то бы в нем было определение методов и таком образом чтоб был инлайн... возникает двойное объявление класса и код не компилируется. Ты как советуешь в таком случае поступить? Я пока думаю инклюдить сппшник в хедер но в сппшник хедер не добавлять и при этом исключить из компиляции сам сппшник ![]() Таким образом я ожидаю что в хедер при помощи инклюда попадет реализация при этом отдельно она компилироватся не будет ТС, прости за отклонение от темы ) модераторов прошу понять и простить )) просто раз уж разговор пошел тут неплохо бы тут и продолжить Добавлено через 11 минут Ну и еще естественно можно убрать сппшник и написать реализацию вне класса... Или как изначально мне хотелось - написать все внутри)) но ты меня отговорил поэтому хотелось бы узнать как сделать лучше учитывая то что писать реализацию внутри класса нежелательно))
0
|
|
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
|
|
| 16.08.2018, 14:31 | |
|
Undisputed, Очевидно, писать их в cpp. Выносить в inline после доказательств, что встраивание улучшает ситуацию. Если код шаблонный - возможны варианты, писать в теле класса (обычно этот вариант выбирают, когда много коротких функций, а вынос функций повлечет написание множество "лишнего" кода - особенно актуально для многоуровневых шаблонов) или выносить в отдельный включаемый файл (этот способ выбирают, когда сами шаблонные функции достаточно крупные). И тот и другой варианты представлены в реализации std::.
По поводу inline, можно почитать классиков здесь (или в его книгах). Советы те же, только более развернуто. Еще можно посмотреть вот это видео.
1
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 16.08.2018, 14:49 [ТС] | |||
![]() Методы мелкие. 1-5 строк Спасибо за ссылки
0
|
|||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
|
||
| 16.08.2018, 15:05 | ||
![]() Тогда в вопросе "как писать" все упирается в корпоративные стандарты (или твои собственные стандарты, если работаешь один). Если охота какой-то строгости, возьми 5-10 крупных открытых проектов и собери статистику по подходам. Выберешь тот, который в большинстве случаев применяется.
1
|
||
|
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
|
||||
| 17.08.2018, 02:12 | ||||
|
Где-то я нашёл три варианта решения и выбрал самый безболезненный: подключаем файл с вынесенным определением шаблонных функций вниз заголовочного, но в проект его не включаем - работает только препроцессор. Впрочем, об этом ты уже упомянул.
1
|
||||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
|
||
| 17.08.2018, 08:33 | ||
|
0
|
||
| 17.08.2018, 08:33 | |
|
Помогаю со студенческими работами здесь
18
Исследовав область определения и выбрав расположение координатных осей на экране и масштаб, построить графики функций
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|