2016-12-29 2 views
2

Мне не удалось найти конкретный ответ на этот вопрос - я знаю, что .h файлы содержат объявления классов, а файлы .cpp содержат реализацию.Смутно в местах объявления класса и реализации в C++

Я смущен относительно того, как это делается без повторения.

Если у меня есть класс Animal, он может быть вызван в нескольких областях программы. Таким образом, мне кажется, мне пришлось бы повторно написать реализацию несколько раз (что, несомненно, означает, что я неправильно понял).

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

Где я ошибался в теме разделения декларации и реализации?

Я все время делал PHP и Python, так что это могут быть привычки, которые меня путают.

+0

Зачем вам нужно переписать реализацию? Вы просто '# include' заголовок, где вам нужен класс. – melpomene

+0

Вам нужно четкое представление о том, что означает #include. [См. Здесь] (https://en.wikipedia.org/wiki/Include_directive) или используйте окно google ... – RamblinRose

+3

Это сложный аспект C++, который часто воспринимается как само собой разумеющийся программистами на C++. В C++ есть что-то называемое ** «Правило одного определения» **, которое в итоге и немного упрощено, указывает, что для каждого объектного файла (называемого «единицей перевода» в стандарте C++) может быть только одно объявление функции/класса - и что единицы преобразования ACROSS, если объявление класса имеет место для одного и того же класса, оно должно быть идентичным. Это позволяет программистам писать код для деклараций класса один раз (в файле заголовка) и повторно использовать его в исходных файлах. –

ответ

5

.cpp файлы скомпилированы один раз в объект (.o).
Это никогда не включены в другие файлы .cpp (что приведет к нескольким определениям, которые являются ошибкой в ​​общем случае).

декларации, которые, как правило, извлекаемые #include ИНГ файлы заголовков, являются как один .cpp файл может знать, что определено в некоторых другой .cpp файл и использовать его фактически без его определения.

После того, как все файлы .cpp были скомпилированы в объектные файлы, компоновщик приходит и связывает все объектные файлы вместе, чтобы сформировать окончательный исполняемый файл или библиотеку.
Если найдено несколько определений одной и той же вещи или отсутствует, это ошибка компоновщика.

+0

Итак, если у меня есть 3 файла cpp с использованием класса 'Animal' из Animal.h, мне нужно только написать реализацию в 1 файл cpp, и это будет признано 2 других? – Pipsqweek

+1

@Pipsqweek да. 'Animal.cpp' будет содержать реализацию« Animal ». Три других файла '.cpp' узнали бы через« Animal.h », что« Animal »- это класс с такими-то функциями, членами и т. Д. Тогда это задача компоновщика, чтобы связать все это вместе, заметив это« Foo. o' хочет вызвать 'Animal :: eat()', который определен в 'Animal.o'. – Quentin

+0

Я получаю это сейчас большое вам спасибо. В моем уме есть небольшой голос, говорящий: «Прокляните мои глаза« import modulename »!» – Pipsqweek

Смежные вопросы