Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция определена в классе, А тело функции находится вне класса. 
:(
    Опции темы
alien_by
Дата 15.12.2004, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 29.11.2004
Где: Belarus/Gomel

Репутация: нет
Всего: 8



Это разделение пошло ещё с C, там в заголовочных файлах описывалис прототипы функций, а их реализации обычно скрывались (путём создания библиотек обьектных файлов), тоже самое делается и сейчас.

Суть же самого разделения на декларацию и имплементацию состоит в том, что декларация (т.е. описание классов) меняется довольно редко, а вот реализация в процессе разработки изменяется часто.

Такое разделение даёт несколько очевидных преимуществ.

1. Скрытие реализации (не скажу, что для всех преимущество smile , однако для разработчиков коммерческих библиотек так точно)
2. Возможность т.н. прекомпиляции (или раздельной компиляции).
3. Стандартизация интерфейсов.

поясню.
С первым понятно... smile

Второе, есть код, который используется повторно в нескольких участках программы, например

Код

// code.h
class Code
{
    Code();
    DoCode();
};

// code.cpp
#include "code.h"
void Code::Code()
{
  // реализация
}

void Code::DoCode()
{
 // реализация
}


и есть несколько участков в которых он используется
Код

#include "code.h"
....
void Section1::func()
{
  Code cd;
  cd.DoCode();
}

....
void Section2::func()
{
  Code* pCode = new Code();
  ...
  pCode->DoCode();
  ...
  delete pCode;
}


Все эти три класса расположены в отдельных файлах и при компиляции образуется три байткодовых файла (Code.obj, Section1.obj, Section2.obj)

А теперь представим что код в классе Code постоянно изменяется (А интерфейс не изменяется). Однако, поскольку Section1 и Section2 ссылаются лишь на прототип класс и поэтому вне зависимости от того, как будет изменён класс Code, эти два класса перекомпилироваться не будут.

Обратная ситуация в случае с реализацией, непосредственно в заголовках. Как известно C++ компилятор (в отличии от компилятора Java) при компиляции некоторого кода руководствуется только набором директив include, всё что будет таким образом найдено, используется при компиляции. Поэтому при описании реализации в заголовочных файлах, для каждого из частков кода (читай файла), который использует эти методы будет создаваться своя копия кода данных методов.(во закрутил smile). Вообщем код описанный в заголовочных компилируется вновь всякий раз, когда будет использован.

Однако есть исключения: inline подстановки, которые и должны каждый раз включаться в том месте где используются (именно поэтому они обязательно должны быть определены в заголовочных файлах). Шаблонные классы, тоже обязательно должны быть определены в заголовках, т.к. для них всё равно в каждом отдельном случае необходима компиляция.

И третье.. связано с первым и вторым. Для некоторых реализации возможно сгенерировать интерфейсы доступа по байткоду, обычно эти интерфейсы получаются в виде заголовочных файлов.
PM MAIL ICQ   Вверх
Hroft
Дата 15.12.2004, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



Цитата(NiJazz @ 15.12.2004, 10:22)
Представляете, если бы книги так писали. 

Может, лучше бы тогда было?

azesmcar все правильно написал.
Кстати, interface и implementation появились в паскале в связи с появлением модулей, а не с поддержкой ООП.

Разделение программы на заголовки (интерфейсы) и реализацию - та же самая инкапсуляция (один из ее видов). Header'ы - это public, cpp - private.
Кстати, если уж на то пошло, то модуль - это просто синглтон. smile У него есть интерфейс, есть реализация, и существует он в единственном экземпляре.
PM MAIL ICQ   Вверх
_hunter
Дата 15.12.2004, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



Цитата
Может, лучше бы тогда было?

сомневаюсь. писать, все-таки, правильно нужно.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Hroft
Дата 15.12.2004, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



А что у него неправильно smile
PM MAIL ICQ   Вверх
_hunter
Дата 15.12.2004, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



пунктуация smile


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
NiJazz
Дата 15.12.2004, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Да и про тещу горестно было читать. smile smile smile smile
А вообще пошёл флейм. smile smile smile
PM MAIL   Вверх
Hroft
Дата 15.12.2004, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



Да уж, действительно хватит.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.