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

Разбиение проекта на файлы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ проверьте что не так http://www.cyberforum.ru/cpp-beginners/thread979632.html
Известно фамилии 12 человек, их семейное положение (женат / замужем) и наличие детей (есть / нет). Определить фамилии женатых, не имеющие детей. #include <iostream> #include <conio.h> using...
C++ Как подсчитать, сколько раз вызван конструктор? Как подсчитать, сколько раз вызван конструктор? http://www.cyberforum.ru/cpp-beginners/thread979608.html
C++ Конструктор копирования
Добрый вечер. Начал изучать перегрузку операций и конструктор копирования. Лазил в инете и налепил такой код. Только вот не могу понять как все таки работает конструктор копирования... Объясните...
C++ Создать список, содержащий информацию о жителях города
Помогите пожалуйста дописать лабу вот задание:(Создать список, содержащий информацию о жителях города. (поля: фамилия, адрес, возраст). Проверить список на наличие граждан, возраст которых превышает...
C++ Массив поиск мин-макс элемента http://www.cyberforum.ru/cpp-beginners/thread979560.html
Задание: Определить в массиве элемент, самый большой в своей строчке и самый минимальный в своем столбце. Если токо элемента нет вывести 0 (5х10, 4х7) Предназначить заполнения массива ...
C++ IsCharAlpha, IsCharAlphaNumeric Существует ли функция, вроде указанных в заголовке, проверяющая, является ли символ знаком препинания, пробелом и т.д. (не цифрой, не буквой)? Хочу вывести в Memo только слова из текста (а в нём... подробнее

Показать сообщение отдельно
mytilus
83 / 83 / 9
Регистрация: 04.10.2012
Сообщений: 335
17.10.2013, 06:20
Видимо, вы не до конца разобрались, в чем смысл разделения файлов на *.cpp и *.h. Постараюсь доходчиво объяснить. Надеюсь, получится не очень длинно.
Весь код вы можете писать как в одном cpp-файле, так и в нескольких. Создание нескольких файлов обуславливается только вашими пожеланиями.
Когда вы запустите компиляцию проекта, компилятор все равно соберет коды из всех cpp-файлов вместе, как будто все изначально было написано в одном файле. Но на этапе программирования вы не можете, например, организовать вызов функции в файле a.cpp, если она объявлена в b.cpp. Для этого и существуют хедеры.
h-файлы хранят код, доступ к которому нужен двум или более cpp-файлам. Во время компиляции каждая запись вида
C++
1
#include "путь_к_файлу"
будет заменена на содержимое указанного файла.
Вот пример. У нас есть два файла. Первый - a.cpp:
C++
1
void Main() {HelloWorld();}
Второй - b.cpp:
C++
1
2
#include <windows.h>
void HelloWorld() {MessageBox(NULL, TEXT("Hello World!"), NULL, 0);}
Функция HelloWorld() не может быть вызвана из a.cpp, потому что реализована в b.cpp. Поэтому создаем хедер header.h, в котором объявим эту функцию:
C++
1
void HelloWorld();
В первой строке обоих cpp-файлов напишем:
C++
1
#include "header.h"
И запустим компилятор. Сначала компилятор прочтет все cpp и соберет их в одно целое:
C++
1
2
3
4
5
6
7
8
// a.cpp
#include "header.h"
void Main() {HelloWorld();}
 
// b.cpp
#include "header.h"
#include <windows.h>
void HelloWorld() {MessageBox(NULL, TEXT("Hello World!"), NULL, 0);}
Потом заменит #include на содержимое указанных файлов:
C++
1
2
3
4
5
6
7
8
// a.cpp
void HelloWorld();
void Main() {HelloWorld();}
 
// b.cpp
void HelloWorld();
/* здесь должно быть содержимое файла windows.h */
void HelloWorld() {MessageBox(NULL, TEXT("Hello World!"), NULL, 0);}
А потом уже будет компилировать получившийся код.
Правда, в нашем случае, вылезет ошибка, потому что HelloWorld() объявляется дважды. Поэтому надо переписать header.h:
C++
1
2
3
4
#ifndef MY_HEADER
  #define MY_HEADER
  void HelloWorld();
#endif
Перевести это можно так:
строка 1: если макрос MY_HEADER не объявлен, то
строка 2: объявить макрос MY_HEADER
строка 3: void HelloWorld();
строка 4: конец условия
Тогда после замены инклюдов компилятор получит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// a.cpp
#ifndef MY_HEADER
  #define MY_HEADER
  void HelloWorld();
#endif
void Main() {HelloWorld();}
 
// b.cpp
#ifndef MY_HEADER
  #define MY_HEADER
  void HelloWorld();
#endif
/* здесь должно быть содержимое файла windows.h */
void HelloWorld() {MessageBox(NULL, TEXT("Hello World!"), NULL, 0);}
А после выполнения директив создаст такой код:
C++
1
2
3
4
5
6
7
// a.cpp
void HelloWorld();
void Main() {HelloWorld();}
 
// b.cpp
/* здесь должно быть содержимое файла windows.h */
void HelloWorld() {MessageBox(NULL, TEXT("Hello World!"), NULL, 0);}
И все будет прекрасно работать.
Если же у нас есть еще один файл - c.cpp - из которого не вызывается HelloWorld(), то строка #include "header.h" ему не нужна.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru