powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Определение и объявление класса
21 сообщений из 21, страница 1 из 1
Определение и объявление класса
    #39617999
Здравствуйте!

Поясните, пожалуйста: для чего иногда объявление класса и его реализацию разносят по *.h и *.cpp соответственно, а иногда - все помещают в один файл (заголовка)?
И - в каких случаях как лучше поступать?

Спасибо.
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618059
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сохраняйте паспорт прибора в течПоясните, пожалуйста: для чего иногда объявление класса и его реализацию разносят по *.h и *.cpp соответственно, а иногда - все помещают в один файл (заголовка)?
И - в каких случаях как лучше поступать?


Так сразу и не объяснишь всего... Попиши года два, может придёт понимание...

На самом деле это ДЕЙСТВИТЕЛЬНО очень сложный вопрос, потому что как раз это решение (в .cpp или .h) проходит по КУЧЕ
trade-off ов. Их примерно штук 10-15, все перечислять ... ну нет.

Поищи по FAQ-ам лучше.
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618076
MasterZiv,

я в печали. :(

Хотя бы парочку примеров приведите, что ли.
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618078
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Header only -- весь код inline. Объём объектного кода растёт многократно.
Object library -- каждый кодовый объект закодирован только один раз. Объём кода минимален.
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618082
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот тебе нашёл в виде FAQ.

https://softwareengineering.stackexchange.com/questions/305618/are-header-only-libraries-more-efficient

Тут наверняка не все аспекты, но больше чем 0.
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618095
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сохраняйте паспорт прибора в течЗдравствуйте!

Поясните, пожалуйста: для чего иногда объявление класса и его реализацию разносят по *.h и *.cpp соответственно, а иногда - все помещают в один файл (заголовка)?
И - в каких случаях как лучше поступать?

Спасибо.

если кратко: то функционал разносят по тем же причинам, по которому у книги есть список глав с нумерацией и содержанием - это удобно. Когда книга большая и нужно понять есть ли в ней нужный тебе раздел ты не листаешь всю книгу, а смотришь в оглавление и сразу делаешь вывод о том, стоит ли листать ее дальше или нужно поискать другую книгу.

Разбиение кода на h и cpp так же позволяет писать библитеки (dll) и скрывать их реализацию в cpp, а пользователю отдавать только описание интерфейсов в h. То есть он может знать что есть такая функция, но как она работает - не его собачье дело - она скомпилирована и спрятана в dll.

Объявления из h файлов удобно подключать в другие h/cpp файлы. Таким образом у нормального разработчика поддерживается порядок среди компонентов проекта, где каждый модуль (h/cpp) отвечает за свою часть задачи и может при необходимости быть подключен к другому модулю, где необходим уже реализованный функционал.

Реализацию хранят в h файлах, как правило, только когда дело касается шаблонов, т.к. это уже компиляторные заморочки при инстанциировании объектов.

Захочешь узнать больше - погугли.
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618149
Cerebrum...Захочешь узнать больше - погугли. Да гуглю я, гуглю...

Cerebrum...если кратко: то функционал разносят по тем же причинам, по которому у книги есть список глав с нумерацией и содержанием - это удобно. Когда книга большая и нужно понять есть ли в ней нужный тебе раздел ты не листаешь всю книгу, а смотришь в оглавление и сразу делаешь вывод о том, стоит ли листать ее дальше или нужно поискать другую книгу...
Наверное, аналогия с книгой годится для случая, когда методы реализованы прямо "в теле" класса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class TestClass
{
public:
	TestClass()
	{
...
	}

	~TestClass()
	{
...
	}

	void F()
	{
...
	}
};


- действительно, не очень удобно, согласен. Но ведь в одном файле, не разнося по разным .h и .cpp, можно и так написать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class TestClass
{
public:

	TestClass();
	~TestClass()
	void F();
};
TestClass::TestClass(){
...
}
TestClass::~TestClass(){
...
}
void TestClass::~F(){
...
}


- тут вроде как и список глав отдельно, и все в одном файле. А редактировать в современных IDE - скорее, без разницы:
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618153
Товарищи монстры!

Не подумайте, бога ради, что я спорю. Я - информацию собираю.
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618160
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сохраняйте паспорт прибора в теч, общее правило - выносить в заголовочные файлы (.h файлы) то, что будет использоваться более чем в одном модуле (.c/.cpp файле).
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618172
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Классически (стандартно) в С++ принято что в .h объявление, а в .cpp определение, т.е. код.

Как уже выше написали помещение кода в .h позволяет компилятору сделать inline, в результате ускорение работы кода.
Писать код только в .h не получится, т.к. не всякий код можно написать в .h
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618179
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПисать код только в .h не получится, т.к. не всякий код можно написать в .h


Так всякий же.
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618199
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDima TПисать код только в .h не получится, т.к. не всякий код можно написать в .h


Так всякий же.
Например static поле.
Код: plaintext
1.
2.
3.
4.
5.
class A {
   static int x;
};

int A::x = 0;


А затем #include в два разных cpp
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618207
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDima TПисать код только в .h не получится, т.к. не всякий код можно написать в .h


Так всякий же.
Еще проблемы когда классы вызывают методы друг-друга.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
class A {
   B b;
};

class B {
   void f(A& a) {
      ...
   }
};
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618425
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
ИХМО рудимент, более современные языки так не поступают.
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618592
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про шаблоны забыли!

Шаблоны всегда пишутся в *.h, так как это не код, а метакод. Если писать его в *.cpp, получится несколько реализаций.
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618841
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivпропущено...


Так всякий же.
Например static поле.
Код: plaintext
1.
2.
3.
4.
5.
class A {
   static int x;
};

int A::x = 0;


А затем #include в два разных cpp

Это -- объявление. Его ДОПУСТИМО размещать во многих единицах компиляции.
Нельзя размещать только ОПРЕДЕЛЕНИЕ.
Отсюда и ODR -- One Definition Rule
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618871
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто -- объявление. Его ДОПУСТИМО размещать во многих единицах компиляции.
Нельзя размещать только ОПРЕДЕЛЕНИЕ.
Отсюда и ODR -- One Definition Rule
Об этом я и писал 21274276
Не все можно писать в .h
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618875
Henocefal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivDima Tпропущено...

Например static поле.
Код: plaintext
1.
2.
3.
4.
5.
class A {
   static int x;
};

int A::x = 0;


А затем #include в два разных cpp

Это -- объявление.
Всё, кроме `static int x;` — это определение.

MasterZivЕго ДОПУСТИМО размещать во многих единицах компиляции.
Нельзя размещать только ОПРЕДЕЛЕНИЕ.
Отсюда и ODR -- One Definition Rule
`int A::x = 0;` тоже допустимо размещать во многих единицах трансляции?
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39618879
Henocefal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TКлассически (стандартно) в С++ принято что в .h объявление, а в .cpp определение, т.е. код.
http://eel.is/c draft/basic.def#2.example-1 [ Example: All but one of the following are definitions:

int a; // defines a
extern const int c = 1; // defines c
int f(int x) { return x+a; } // defines f and defines x
struct S { int a; int b; }; // defines S, S​::​a, and S​::​b
struct X { // defines X
int x; // defines non-static data member x
static int y; // declares static data member y
X(): x(0) { } // defines a constructor of X
};
int X::y = 1; // defines X​::​y
enum { up, down }; // defines up and down
namespace N { int d; } // defines N and N​::​d
namespace N1 = N; // defines N1
X anX; // defines anX

whereas these are just declarations:

extern int a; // declares a
extern const int c; // declares c
int f(int); // declares f
struct S; // declares S
typedef int Int; // declares Int
extern X anotherX; // declares anotherX
using N::d; // declares d

— end example
 ]
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39619065
Фотография tehKosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, да, многие программисты даже с многолетним опытом путаются что такое объявление и определение классов, путают определение класса и определение его методов, и то что допустимы множественные определения классов.. на все это накладываются дополнительные заморочки с inline и статик.. ну и шаблоны сверху все еще более усложняют
...
Рейтинг: 0 / 0
Определение и объявление класса
    #39619179
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HenocefalMasterZivпропущено...


Это -- объявление.
Всё, кроме `static int x;` — это определение.



Именно. Это объявление. Его можно хоть 200 раз делать.

HenocefalMasterZivЕго ДОПУСТИМО размещать во многих единицах компиляции.
Нельзя размещать только ОПРЕДЕЛЕНИЕ.
Отсюда и ODR -- One Definition Rule
`int A::x = 0;` тоже допустимо размещать во многих единицах трансляции?

нет.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Определение и объявление класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]