0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 98
|
|
1 | |
Глобальное разрешение ::15.04.2017, 19:55. Показов 2736. Ответов 27
0
|
15.04.2017, 19:55 | |
Ответы с готовыми решениями:
27
очень глобальное определение вопрос про глобальное пространство имен Глобальное считывание комбинаций win api Глобальное задание, охватывающее почти весь с++ |
7774 / 6544 / 2981
Регистрация: 14.04.2014
Сообщений: 28,565
|
|
15.04.2017, 20:23 | 2 |
Чтобы разделить на h и cpp. Или просто для удобства, если разделения нет.
0
|
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 98
|
||||||
15.04.2017, 21:19 [ТС] | 3 | |||||
Не, я про другое, вот:
0
|
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 98
|
|
15.04.2017, 21:28 [ТС] | 5 |
Т.е. для того, чтобы использовать один класс в разных программах, а при надобности просто добавлять к нему другие методы как раз этой операцией?
0
|
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
|
15.04.2017, 21:37 | 7 |
1
|
863 / 451 / 89
Регистрация: 10.06.2014
Сообщений: 2,643
|
|
15.04.2017, 21:43 | 8 |
_stanislav,
А с чего вы взяли, что при определении метода указанным образом, компиляторы не применят inline?
1
|
"C with Classes"
|
|
15.04.2017, 21:57 | 9 |
Не по теме: Undisputed, поспорить хочешь? 8-) Добавлено через 4 минуты Имейте в виду, что директива inline – это совет, а не команда компилятору. Совет может быть сформулирован явно или неявно. Неявный способ заключается в определении встроенной функции внутри определения класса. ©Скотт Мэйерс
0
|
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 98
|
|
15.04.2017, 22:02 [ТС] | 10 |
Undisputed, а для чего тогда указывать таким образом? просто, чтоб в классе не нагромождать?
0
|
Комп_Оратор)
|
|
15.04.2017, 23:18 | 11 |
Tanya228, у разделения объявления и определения есть более веские причины. Когда потребуется перекрёстное включение классов Вы увидите, что иначе не обойтись. Дело в том, что иногда комбинация опережающего объявления и использование указателя недостаточно, так как нужно вызывать методы. Однако включить хедеры связываемых классов друг в друга нельзя не получив двойных объявлений. Тогда в одном классе включают хедер в cpp файл другого класса из пары которая связывается. Это трудно объяснять и громоздко иллюстрировать. Однако, когда Вам это потребуется, Вы сможете спросить более конкретно. Пока что, достаточно понять, что это способ разделения интерфейса и реализации. То есть, дорога к свету.
0
|
7 / 7 / 2
Регистрация: 28.04.2015
Сообщений: 21
|
|
15.04.2017, 23:24 | 12 |
Бред, такое объявление делается только для удобства. GCC или VC++ с флагом -O2 спокойно инлайнят любые методы, если считают что так будет производительнее.
За исключением функций которым жестко запрещено встраивание (__declspec(noinline), #pragma function(...), etc...)
0
|
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
|
|
16.04.2017, 01:33 | 13 |
какое нахрен удобство. если кому-то удобно - то это побочный эффект.
уже написали, что это для разделения реализации и интерфейса. если это слишком звучит слишком абстрактно, то вот еще один конкрентый пример: есть собранная библиотека в либ файле. кто, как и из каких исходников ее собрал - это не сильно важно для того, чтобы ее использовать. для использования нужен интерфейс (все, что в инклудниках), и собранная библиотека в lib файле. либ файл может быть собран из секретных исходников, до которых у вас доступа нет, он может быть собран из исходников на другом языке программирования, он может просто долго собираться, если его с нуля билдить. если библиотек в проекте много, то банальная пересборка проекта может длиться часами и т.д. и т.п.
1
|
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
|
|
16.04.2017, 09:35 | 14 |
Ну скорее всего это сделанно для того что бы вам показать что в классе не стоит реализовывать методы так как это усложняет читаймость, хотя при этом это можно делать и будет работать так и так, еще же можно реализацию метода положить и в другой файл.
1
|
Комп_Оратор)
|
|
16.04.2017, 10:01 | 15 |
Tanya228, вот недавно была похожая тема:
Нюансы объявления класса посмотрите. Правила (ODR) не позволяют определять переменную дважды в одной области видимости и это может вызвать трудности, когда определение двух зависимых классов нуждается в ссылках друг на друга. Я уже говорил, что это несколько громоздко и для иллюстрации и для понимания. При решении реальной задачи, где без этого не обойтись, Вам придётся это разобрать. Иначе, возможно, Вы сочтёте это сложным. Поэтому и говорю, - считайте пока, что это имеет смысл и оставьте до поры.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
16.04.2017, 12:54 | 16 | ||||||||||
господин _stanislav прав.
но не совсем раскрыл момент. действительно, определенные прямо в теле класса методы являются inline в отличие от тех, что были определены в cpp. главное различие между inline функциями и не inline, заключается в том, что inline обладают внутренним связыванием. в то время, как обычные функции - внешним. и вот в чем разница между этими двумя видами связывания? представьте себе, что вы разрабатываете библиотеку foo.lib. она собирается отдельно. а потом уже пользовательское приложение с нею линкуется:
однако дело не в теоретической возможности, встроить функцию с external linkage. а в практической целесообразности. представьте себе, что компилятор таки встроил функцию библиотеки. ну и как потом пользователи смогут её вызывать? а то, что торчит прямо в хедерах, вполне себе безопасно можно встраивать.
1
|
863 / 451 / 89
Регистрация: 10.06.2014
Сообщений: 2,643
|
|
16.04.2017, 15:45 | 17 |
ИМХО компилятор же видит когда цепляется уже скомпилированная либа, соответственно может сообразить как организовать код в отношении кода из подключаемой библиотеки, и так же видит код который нужно скомпилировать и заинлайнить...
так же не понятно почему компилятор при генерации машинного кода с учетом скомпилированной библиотеки не может прикинуться что на самом деле никакой либы нет? компилятор же знает какой код должен быть выполнен с учетом подключенной библиотеки... или нет? в таком случае использование даже высокопроизводительных библиотек становится не таким уж и высокопроизводительным удовольствием ибо в результате исполняемый код будет оставлять желать лучшего....
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
16.04.2017, 22:05 | 19 | |||||
ну например, в стандарте есть упоминание,
что встраиваемые функции имеют иммунитет против ошибки множественного определения. но только функции с внутренним связыванием имеют такой иммунитет.
1. создаете статическую библиотеку. принудительно заставляете компилятор сделать функцию с external linkage inline получаете уже готовый скомпилированный код 2. создаете проект.exe линкуетесь с библиотекой созданной ранее. 3. пытаетесь вызвать функцию, которая по факту была встроена. 4. получаете ошибку линковки: а функция то тю-тю.
0
|
Неэпический
|
|
16.04.2017, 22:55 | 20 |
Сделайте статическую переменную в функции и посмотрите.
Если бы связывание было внутренним - это были бы разные переменные в каждой единице трансляции. Согласно стандарту остается лишь одна реализация, остальные при сборке просто выпиливаются. Какая остается? Зависит от левой пятки компилятора. Собственно, поэтому функция должна иметь одинаковое определение во всех единицах трансляции где используется, иначе потом компилятор оставит только одну и будет сюрприз, хотя всё и соберется без проблем.
0
|
16.04.2017, 22:55 | |
16.04.2017, 22:55 | |
Помогаю со студенческими работами здесь
20
Как сделать глобальное пространство имени? Глобальное задание массива в качестве параметра функции Глобальное переопределение "operator <<" для char * Разрешение приложения - чтобы приложение подстраивалось под разрешение экрана Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |