Эта статья предназначена прежде всего для тех, кто попал на текущую страницу, выискивая что-то похожее на ответ на вопрос компилирования программ из нескольких файлов в Visual Studio. На сайте есть более красочная тема, в которой показывается как делать проект из нескольких файлов. Так получилось, что эту статью я написал раньше той, но решил не удалять. Пусть для одних это будет знакомство, для других повторение.
Часто начинающие программисты видят код одной программы, разбитый на части. Разбивать одну программу на несколько файлов очень распространённая практика. Но вот бывает, что новичку понять, как же ему самостоятельно разделить код на части или как его читать, не очень ясно. Попробую разъяснить это (иногда) затруднительное место.
В качестве обучающего примера возьмём простую задачу:
Создать метод класса, с помощью которого вывести сообщение приветствия на экран. При создании класса отделить интерфейс от реализации.
Написание такой программы чем-то сильно напоминает написание "Hello World". В качестве инструмента решения было выбрано Visual Studio Express 2012. Время сменится, эта версия студии устареет, но общий принцип останется тем же. Вы можете использовать свою версию.
При разбиении одной программы на файлы обычно у нас получается 3 файла:
Основная программа. В нашем случае программа, внутри которой функция main(). Внутри функции main() нами будет задействоваться основная часть, выносимая в отдельные файлы: будет вызываться метод создаваемого класса.
Класс будет поделен на 2 части. Каждая из частей — отдельный файл.
Интерфейс
Реализация
Сейчас предполагается, что основное окно для написания кода у вас уже открыто, поэтому начинаем с создания двух дополнительных пустых файлов.
Первый файл создадим в заголовочных файлах и назовем его MyHeadFile.h (Мой заголовочный файл)
Второй файл создадим в файлах исходного кода и назовем его MyRealisation.cpp (Моя реализация)
Что это за файлы и зачем они нужны? Один из файлов будет содержать интерфейс класса, второй реализацию этого класса. Дальше по коду вы увидите, что это обозначает.
В заголовочном файле описывают интерфейс класса.
C++
1
2
3
4
5
6
7
8
9
10
11
//Интерфейс класса в заголовочном файле MyHeadFile.h
#ifndef MYHEADFILE_H
#define MYHEADFILE_H
classMyClass
{
public:
voidshow();//Для класса будет описан один метод
};
#endif
Можно сказать, что класс, который описан, но у которого не описано поведение функций — это интерфейс класса.
Неясность у новичков получается из-за:
C++
1
2
3
4
#ifndef MYHEADFILE_H
#define MYHEADFILE_H
#endif
Неопытному глазу сложно понять, что это такое. Это конструкция такая, которая предотвращает многократное включение заголовочного файла (в моем примере файла MyHeadFile.h). По негласному соглашению в этой конструкции в имени файла вместо точки используется подчеркивание.
Надеюсь, что что такое интерфейс стало понятно. Чтобы интерфейс не дублировался в исходный код программы, его обычно защищают предотвращающей многократное включение одного файла конструкцией.
Две части готовы. Осталось описать поведение классу. Это делается в файле реализации. В начале темы говорилось, что мы делаем два дополнительные файла: файл реализации и файл интерфейса. Файл интерфейса мы описали, теперь пишем реализацию. В файле реализации описываем функции в самом обычном для функций виде, но в нашем случае с обозначением привязки к классу, как обычно делают при вынесении методов класса за класс.
MyRealisation.cpp
C++
1
2
3
4
5
6
7
8
//
#include "MyHeadFile.h" //Подключаем заголовочный файл с интерфейсом
Вот это вся реализация, которая нужна для вывода одного сообщения. Для новичка важно понять, что здесь только описывается поведение функций из нужного нам класса. Сам интерфейс класса описан в подключенном заголовочном файле, поэтому void::MyClass::show() не вызывает ошибок.
Основное всё готово. Дело осталось за малым. Остаётся создать объект класса MyClass и вызвать его метод show(). Объявим объект внутри функции main(), к нужному методу объявленного объекта также обратимся в функции main(). Надеюсь, объяснять, что такое функция main() и где её искать, не надо.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "MyHeadFile.h" //Обязательно подключаем заголовочный файл, только что который сами создавали
intmain()
{
setlocale(LC_ALL,"");
MyClass obj;//Создал объект, тип которого MyClass. MyClass описан в MyHeadFile.h
obj.show();//Для объекта вызвал метод класса. Реализация Метода описана в MyRealisation.cpp
std::cin.get();
return0;
}
Вот и весь пример. Безусловно, этот пример очень примитивен и всех ответов сразу не даст. Но зато благодаря своей простоте он может помочь в начинании понимания всей этой темы по отделению интерфейсов от реализации.
4 комментария на «“Visual C++ Классы для начинающих. Отделение интерфейса от реализации”»
Огромное спасибо, все предельно понятно
Спасибо, а то понять не мог раньше)
Небольная ошибка, вместо:
нужно:
А то компилятор ругается, а так спасибо, все хорошо объяснено)
Ага совсем небольНая