Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Sparrow44
26 / 26 / 1
Регистрация: 20.02.2012
Сообщений: 350
#1

Создание классов в С++. Раздельная компиляция - C++

08.05.2014, 20:14. Просмотров 760. Ответов 6
Метки нет (Все метки)

При создании класса C++ в VS создается два файла, "<имя_класса>.h" и "<имя_класса>.cpp", зачем они ? В каком сам класс писать? Простите за глупый вопрос, но только начал разбираться и вот сразу такой момент в моей книге про это не слова :-) Даже странно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2014, 20:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание классов в С++. Раздельная компиляция (C++):

Раздельная компиляция шаблонов классов - C++
При разделении шаблона класса на .h и .cpp линковщик ругается. Неужели в C++17 ещё не пофиксили это недоразумение и придётся писать всё в...

раздельная компиляция - C++
Вот есть три файла: заголовочный файл с классом (.h), файл с реализацией методов класса (.cpp), и функцию main. Как, корректно, выполнить...

Раздельная компиляция - C++
Здравствуйте, я перечитал на форуме информацию по этой теме, но пока что не сумел разобраться. У меня в проекте такие файлы: ...

Раздельная компиляция - C++
Пусть есть программа, которая состоит из 2 файлов. 1 файл: основной, там где main 2 файл: содержит некоторые функции Также есть...

Раздельная компиляция - C++
В Гугле не забанен,нашел описание самого принципа,но конкретных примеров не нашел. Вопросы вот какие: 1) Если у меня есть класс,...

Раздельная компиляция файлов - C++
Если класс определен в раздельных файлах и изменения сделаны в части main программы, кот использует класс - какой файл необходимо...

6
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
08.05.2014, 20:33 #2
Поговорим о единицах трансляции Каждый раз когда ваш VS компилирует проект он обрабатывает набор переданных ему .cpp файлов - эти файлы содержат исходный код реализации (определения методов/классов/функций/переменных) Данные файлы посредством компиляции преобразуются в .o - объектные файлы, содержащие машинный код. Каждый из .cpp файлов может компилироваться как самостоятельная единица. Но как же быть, когда в одном .cpp файле нужно вызвать функцию из другого .cpp файла - тут то на помощь и приходят .h файлы - В них содержится код объявлений (объявления методов/функций/переменных). Каждый раз, когда программист хочет использовать некоторую фукнцию более одного раза, он во-первых, помещает определение функции в .cpp файл, а объявление - в .h - файл, во-вторых, во всех .cpp файлах, где необходимо использовать функцию он добавляет директиву препроцессора #include "somefilewithourfoo.h". Препроцессор обрабатывает исходные коды в .cpp файлах еще до компилятора - просто как текст, он заменяет директиву - всем содержимым .h файла. За счет этого гарантируется, что в двух разных .cpp файлах будет содержаться одинаковое объявление классов/функций/методов. Возвращаясь к вопросу компиляции - когда отдельные .o файлы получены, осталось соединить всё вместе - для этого существует линковщик. Если в коде программы находится вызов функции, определение которой не дано в той же единице трансляции (том-же .cpp файле) - то вместо него используется заглушка, которая должна быть заменена линковщиком - на смещение - после нахождение определения этой функции - в другой единице трансляции. Для линковщика какраз и важно совпадение объявлений и определений функций - если таковое не найдено - будет выдана ошибка линковки и собрать программу до конца не удастся. < - Это, быть может слегка сумбурно - на тему "зачем они". А в целом - в .h нужно писать объявления классов (имя класса, объявления публичных и приватных метдов, полей и т.д.) в .cpp файле нужно писать определения конкретных методов, полей и т.д. - В конечном счете компилируются только .cpp файлы, а .h - включаются в них при помощи препроцессора.
Если нормально воспринимаете материал в лекционном формате, советую посмотреть http://www.youtube.com/watch?v=2uZlh7ZmOiM - какраз рассматривается подробно программа состоящая из нескольких файлов, и как вообще устроен процесс преобразования исходных кодов понятных человеку, в машинные коды.
2
S_el
2109 / 1628 / 308
Регистрация: 15.12.2013
Сообщений: 6,523
08.05.2014, 20:39 #3
Sparrow44, для начала можете вообще .h файлы не создавать,пишите как раньше в main.cpp вместе с классами
0
Sparrow44
26 / 26 / 1
Регистрация: 20.02.2012
Сообщений: 350
08.05.2014, 21:12  [ТС] #4
Цитата Сообщение от S_el Посмотреть сообщение
для начала можете вообще .h файлы не создавать,пишите как раньше в main.cpp вместе с классами
Лучше сразу привыкать писать правильно :-) Чем писать просто, но не правильно.
0
S_el
2109 / 1628 / 308
Регистрация: 15.12.2013
Сообщений: 6,523
08.05.2014, 21:26 #5
Sparrow44, а кто сказал что так писать не правильно?
0
Sparrow44
26 / 26 / 1
Регистрация: 20.02.2012
Сообщений: 350
08.05.2014, 23:22  [ТС] #6
Цитата Сообщение от S_el Посмотреть сообщение
а кто сказал что так писать не правильно?
Просто , на мой взгляд, если классы выделять в отдельные файлы, то такая программа легче читается и понимается. Нас так в универе учили по крайне мере.
0
S_el
2109 / 1628 / 308
Регистрация: 15.12.2013
Сообщений: 6,523
08.05.2014, 23:27 #7
Sparrow44, зависит от объема программы
А вообще для этого и сделали,чтобы не нагромождать все в 1 файл.
0
08.05.2014, 23:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2014, 23:27
Привет! Вот еще темы с ответами:

Шаблоны и раздельная компиляция - C++
Здравствуйте! Если просто я пишу класс, например: class Test { private: int *pm; ... public: bool inc();

Раздельная компиляция и шаблоны - C++
Есть 3 файла с кодом: 1) foo.hpp template&lt;typename T&gt; class foo { public: T bar; foo(); ~foo(); };

Раздельная компиляция ошибка LNK2019 - C++
Создал Header file #ifndef prata_9_1_H_ #define prata_9_1_H_ struct XY { int i_x; // distance from origin int i_y; // direction...

Раздельная компиляция ( Code blocks) - C++
версия 16.01 при вызове функции из другого файла, стал писать, что я не указал прототип функции и &quot;ld returned 1 exit status&quot;. хотя делал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru