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

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

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

Показать сообщение отдельно
mytilus
82 / 82 / 8
Регистрация: 04.10.2012
Сообщений: 329
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" ему не нужна.
 
Текущее время: 22:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru