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

Поиск:

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


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Функция определена в классе, а тело функции находится вне класса.
Почему так делают?

Или жетело функции располагают в:

Код

class name {
public:
void funktion() {тело};


}


Разве так удобно? Имхо гораздо удобнее в public, pivate, protected описать только по-определять функции, а снизу в этом же классе уже изложить сами функции. Такое возможно?

А то я видел только еще такой вариант:

Код

class name {
public:
void funktion();

}

name::function () {


}


PS. За синтаксис не ручаюсь smile
PM WWW   Вверх
_hunter
Дата 14.12.2004, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 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...
PM ICQ   Вверх
Wowa
Дата 14.12.2004, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Цитата(_hunter @ 14.12.2004, 12:12)
так можно ( только реализацию в .cpp вынести нужно )

А поподробнее можно? Разве классы не в .cpp создавать надо?


Цитата(_hunter @ 14.12.2004, 12:12)
class name {
public:
void funktion() {тело};

}

это делается если тело функции -- пара строк ( например:
...
public:
...
int getId() {return id; };
)
>>Разве так удобно?
мне -- удобно

А если не пару строк, то как поступать?



Цитата(_hunter @ 14.12.2004, 12:12)
это из Java?

Хм.. из логики smile

Ведь если мы имеем обычную программу(не ООП), то в самом начале мы задаем список функций, которые есть в программе, а снизу сами функции.
PM WWW   Вверх
bel_nikita
Дата 14.12.2004, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Admin
Цитата
Разве так удобно? Имхо гораздо удобнее в public, pivate, protected описать только по-определять функции, а снизу в этом же классе уже изложить сами функции. Такое возможно?

Это уже дело вкуса и стиля программиования smile

Если функция объявлена и определена в *.Н - это inline функция. Вот, такое будет говорить компилятору, что это инлайн функция:
Код

class name {
public:
void funktion() {тело};
};

Но в тоже время, это не факт, что она 100% будет инлайн. Это будет решать компилятор smile Т.е. если в теле функции будет ветвления, типа if() {...} else{...}, то компилятор не будет приминять идентифиукатор inline. Т.е. это на усмотрение компилятора. Но если мы хотим все же сделать 100% инлайн, то нужно добавить, например в MSVC, идентификатор __forceinline.

З.Ы.: Не знаю, что-то написал. Если не понятно, извиняйте smile

Добавлено @ 14:26
Цитата
А поподробнее можно? Разве классы не в .cpp создавать надо?

Можно smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Wowa
Дата 14.12.2004, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Функции лучше создавать в файлах с расширением .h, а не .cpp ?
PM WWW   Вверх
_hunter
Дата 14.12.2004, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

А поподробнее можно? Разве классы не в .cpp создавать надо?


классы _создаются_ в двух местах:

в .h файле идет описание:
Код

class name
{
public:
   void funktion();
};


а в .cpp идет реализация:
Код

void name::funktion()
{
...
}


про джаву упомянул так как там используют однофайловую структуру ( очень похожую на описанную )

Это сообщение отредактировал(а) _hunter - 14.12.2004, 14:33


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


Нереварин
**


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

Репутация: 27
Всего: 49



Цитата

Но если мы хотим все же сделать 100% инлайн, то нужно добавить, например в MSVC, идентификатор __forceinline.

Не факт, что 100% smile
Вот это компилятор встроить не сможет
Код

__forceinline void func(void)
{
   // ...
}

int main(void)
{
   void (*p)(void) = func;

    func(); // функция встроена не будет!
}



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
bel_nikita
Дата 14.12.2004, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Admin
Цитата
Функции лучше создавать в файлах с расширением .h, а не .cpp ?

Нннн-ет. Все же лучше в *.cpp smile
ИМХО: если класс маленький, т.е. с парой-другой коротеньких функция, то лучше все запихнуть в *.h


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Wowa
Дата 14.12.2004, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Цитата(_hunter @ 14.12.2004, 12:31)
про джаву упомянул так как там используют однофайловую структуру ( очень похожую на описанную )

ага..., вот как интересно... Оказывается все-таки стандартом в С++ является разделение описания и реализации класса.
Теперь все сильно проясняется.
Добавлено @ 14:35
Цитата(bel_nikita @ 14.12.2004, 12:34)
ИМХО: если класс маленький, т.е. с парой-другой коротеньких функция, то лучше все запихнуть в *.h

И при этом реализацию функий делать прямо в секции public, private или protected?
PM WWW   Вверх
_hunter
Дата 14.12.2004, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



соответственно _маленькие_ функции ( выполняющие _понятные_ действия ) лучше писать в опимании класса, остальные -- выносить в реализацию

но, как уже упоминали, это все дело стиля


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


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



А по другому не дано? Т.е. делать реализацию внутри класса, но не в описании?
PM WWW   Вверх
_hunter
Дата 14.12.2004, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



не в секции, а именно в месте определения:
Код

class name
{
public:
   void funktion() { что-то_делаем; };
};




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


Jazz coder
****


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

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



Если описание класса делать в заголовочном файле h, а реализацию - в cpp, это даёт возможность без проблем использовать наш класс в других наших программах, где нужно будет только включить наш заголовочный файл.
А вот когда создали Object Pascal, то там это реализовали путем введения областей interface и implementation. Видимо, если модуль с описанием класса используется в других модулях, то компилятор ориентируется лишь в interface области кода.
PM MAIL   Вверх
azesmcar
Дата 15.12.2004, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Представь, тебе надо написать интерфейс. Короче говоря класс который потом будет

использоваться тобой же или другим программистом. Если написать все в Header -е то тебе придется все include-ы которые будет использовать твой класс пихать в свой header файл...А теперь представь что тому программисту который будет использовать твой интерфейс совсем неохота чтоб у него в программе после инклуда твоего .h файла появился например list или stdio.h хотя бы потому что list это девичья фамилия его тещи которая так ненавящиво напоминает ему что новый год хочешь не хочешь а придется провести с вышеупомянутой родственницей да еще и поздравлять ее с праздником и целовать ее прыщавую физиономию..ну не любит он тещю, бывает такое...а ты как бы заставляешь его инклудить все то что нужно тебе, а быть может совсем не нужно ему...(вполне возможно что у него тоже есть класс list или функция принтф)...
Вобщем ВСЕ функции желательно писать в CPP файле...smile
PM   Вверх
NiJazz
Дата 15.12.2004, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



Цитата
Представь, тебе надо написать интерфейс. Короче говоря класс который потом будет

использоваться тобой же или другим программистом. Если написать все в Header -е то тебе придется все include-ы которые будет использовать твой класс пихать в свой header файл...А теперь представь что тому программисту который будет использовать твой интерфейс совсем неохота чтоб у него в программе после инклуда твоего .h файла появился например list или stdio.h хотя бы потому что list это девичья фамилия его тещи которая так ненавящиво напоминает ему что новый год хочешь не хочешь а придется провести с вышеупомянутой родственницей да еще и поздравлять ее с праздником и целовать ее прыщавую физиономию..ну не любит он тещю, бывает такое...а ты как бы заставляешь его инклудить все то что нужно тебе, а быть может совсем не нужно ему...(вполне возможно что у него тоже есть класс list или функция принтф)...
Вобщем ВСЕ функции желательно писать в CPP файле...smile

Представляете, если бы книги так писали. smile smile smile
PM MAIL   Вверх
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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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