![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Wowa |
|
||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Функция определена в классе, а тело функции находится вне класса.
Почему так делают? Или жетело функции располагают в:
Разве так удобно? Имхо гораздо удобнее в public, pivate, protected описать только по-определять функции, а снизу в этом же классе уже изложить сами функции. Такое возможно? А то я видел только еще такой вариант:
PS. За синтаксис не ручаюсь |
||||
|
|||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
class name {
public: void funktion() {тело}; } это делается если тело функции -- пара строк ( например: ... public: ... int getId() {return id; }; ) >>Разве так удобно? мне -- удобно >>Имхо гораздо удобнее в public, pivate, protected описать только по-определять функции, а снизу в этом же классе уже изложить сами функции. это из Java? >>А то я видел только еще такой вариант: class name { public: void funktion(); } name::function () { } так можно ( только реализацию в .cpp вынести нужно ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Wowa |
|
||||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
А поподробнее можно? Разве классы не в .cpp создавать надо?
А если не пару строк, то как поступать?
Хм.. из логики Ведь если мы имеем обычную программу(не ООП), то в самом начале мы задаем список функций, которые есть в программе, а снизу сами функции. |
||||||
|
|||||||
| bel_nikita |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Admin
Это уже дело вкуса и стиля программиования Если функция объявлена и определена в *.Н - это inline функция. Вот, такое будет говорить компилятору, что это инлайн функция:
Но в тоже время, это не факт, что она 100% будет инлайн. Это будет решать компилятор З.Ы.: Не знаю, что-то написал. Если не понятно, извиняйте Добавлено @ 14:26
Можно |
||||||
|
|||||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Функции лучше создавать в файлах с расширением .h, а не .cpp ?
|
|||
|
||||
| _hunter |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
классы _создаются_ в двух местах: в .h файле идет описание:
а в .cpp идет реализация:
про джаву упомянул так как там используют однофайловую структуру ( очень похожую на описанную ) Это сообщение отредактировал(а) _hunter - 14.12.2004, 14:33 -------------------- Tempora mutantur, et nos mutamur in illis... |
||||||
|
|||||||
| srd |
|
||||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Не факт, что 100% Вот это компилятор встроить не сможет
-------------------- Не смей читать мою подпись!!! |
||||
|
|||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Admin
Нннн-ет. Все же лучше в *.cpp ИМХО: если класс маленький, т.е. с парой-другой коротеньких функция, то лучше все запихнуть в *.h |
|||
|
||||
| Wowa |
|
||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
ага..., вот как интересно... Оказывается все-таки стандартом в С++ является разделение описания и реализации класса. Теперь все сильно проясняется. Добавлено @ 14:35
И при этом реализацию функий делать прямо в секции public, private или protected? |
||||
|
|||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
соответственно _маленькие_ функции ( выполняющие _понятные_ действия ) лучше писать в опимании класса, остальные -- выносить в реализацию
но, как уже упоминали, это все дело стиля -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
А по другому не дано? Т.е. делать реализацию внутри класса, но не в описании?
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
не в секции, а именно в месте определения:
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 1 Всего: 23 |
Если описание класса делать в заголовочном файле h, а реализацию - в cpp, это даёт возможность без проблем использовать наш класс в других наших программах, где нужно будет только включить наш заголовочный файл.
А вот когда создали Object Pascal, то там это реализовали путем введения областей interface и implementation. Видимо, если модуль с описанием класса используется в других модулях, то компилятор ориентируется лишь в interface области кода. |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Представь, тебе надо написать интерфейс. Короче говоря класс который потом будет
использоваться тобой же или другим программистом. Если написать все в Header -е то тебе придется все include-ы которые будет использовать твой класс пихать в свой header файл...А теперь представь что тому программисту который будет использовать твой интерфейс совсем неохота чтоб у него в программе после инклуда твоего .h файла появился например list или stdio.h хотя бы потому что list это девичья фамилия его тещи которая так ненавящиво напоминает ему что новый год хочешь не хочешь а придется провести с вышеупомянутой родственницей да еще и поздравлять ее с праздником и целовать ее прыщавую физиономию..ну не любит он тещю, бывает такое...а ты как бы заставляешь его инклудить все то что нужно тебе, а быть может совсем не нужно ему...(вполне возможно что у него тоже есть класс list или функция принтф)... Вобщем ВСЕ функции желательно писать в CPP файле... |
|||
|
||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 1 Всего: 23 |
Представляете, если бы книги так писали. |
|||
|
||||
| alien_by |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 29.11.2004 Где: Belarus/Gomel Репутация: нет Всего: 8 |
Это разделение пошло ещё с C, там в заголовочных файлах описывалис прототипы функций, а их реализации обычно скрывались (путём создания библиотек обьектных файлов), тоже самое делается и сейчас.
Суть же самого разделения на декларацию и имплементацию состоит в том, что декларация (т.е. описание классов) меняется довольно редко, а вот реализация в процессе разработки изменяется часто. Такое разделение даёт несколько очевидных преимуществ. 1. Скрытие реализации (не скажу, что для всех преимущество 2. Возможность т.н. прекомпиляции (или раздельной компиляции). 3. Стандартизация интерфейсов. поясню. С первым понятно... Второе, есть код, который используется повторно в нескольких участках программы, например
и есть несколько участков в которых он используется
Все эти три класса расположены в отдельных файлах и при компиляции образуется три байткодовых файла (Code.obj, Section1.obj, Section2.obj) А теперь представим что код в классе Code постоянно изменяется (А интерфейс не изменяется). Однако, поскольку Section1 и Section2 ссылаются лишь на прототип класс и поэтому вне зависимости от того, как будет изменён класс Code, эти два класса перекомпилироваться не будут. Обратная ситуация в случае с реализацией, непосредственно в заголовках. Как известно C++ компилятор (в отличии от компилятора Java) при компиляции некоторого кода руководствуется только набором директив include, всё что будет таким образом найдено, используется при компиляции. Поэтому при описании реализации в заголовочных файлах, для каждого из частков кода (читай файла), который использует эти методы будет создаваться своя копия кода данных методов.(во закрутил Однако есть исключения: inline подстановки, которые и должны каждый раз включаться в том месте где используются (именно поэтому они обязательно должны быть определены в заголовочных файлах). Шаблонные классы, тоже обязательно должны быть определены в заголовках, т.к. для них всё равно в каждом отдельном случае необходима компиляция. И третье.. связано с первым и вторым. Для некоторых реализации возможно сгенерировать интерфейсы доступа по байткоду, обычно эти интерфейсы получаются в виде заголовочных файлов. |
||||
|
|||||
| Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Может, лучше бы тогда было? azesmcar все правильно написал. Кстати, interface и implementation появились в паскале в связи с появлением модулей, а не с поддержкой ООП. Разделение программы на заголовки (интерфейсы) и реализацию - та же самая инкапсуляция (один из ее видов). Header'ы - это public, cpp - private. Кстати, если уж на то пошло, то модуль - это просто синглтон. |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
сомневаюсь. писать, все-таки, правильно нужно. -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
А что у него неправильно
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
пунктуация
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 1 Всего: 23 |
Да и про тещу горестно было читать.
А вообще пошёл флейм. |
|||
|
||||
| Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Да уж, действительно хватит.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |