При реализации примеров наследования (см. главы 8 и 9) мы объединяли в одном модуле и базовый, и производный классы. В качестве примера можно привести реализацию базового класса TStack (см. листинг 6.9) и его наследников (см. листинги 8.9-8.11). Однако стек нам может понадобиться и в других программах, поэтому естественно выделить этот класс в отдельную единицу трансляции. Создадим файл TStack.cpp и перенесем в него определение класса TStack. Содержимое этого файла представлено в листинге 13.1.
Как видите, определение класса не меняется, только переносится в отдельный файл. Другой модуль с именем main.cpp (листинг 13.2) содержит программу-клиент, использующую наш стек. Листинг 13.1. Содержимое файла TStack.срр
ВНИМАНИЕ
При создании проекта средствами интегрированной среды Visual Studio.NET 2003 файл main.cpp должен быть единственным в проекте.
Листинг 13.2. Содержимое файла main.cpp
#include "TStack.срр" #include<iostream> using namespace std; int main() { TStack t;
t.push(new double(l));
t.push(new double(2));
t.push(new double(3));
while (!t.emptyO) { cout << "(double *)t.top() << endl; double *p = (double *)t.pqp(); delete p; } } // наш файл // системный файл // стандартное пространство имен
// помещаем в стек числа
// пока стек не пустой // выводим число с вершины // удаляем элемент из стека // возвращаем память
Объединение модулей в единую программу осуществляется препроцессором по директиве включения: #include имя__файла
Эту директиву мы уже неоднократно использовали, не вдаваясь в подробности. Препроцессор, обнаружив директиву, «подставляет» на ее место указанный файл. Обратите внимание на то, что две директивы #include написаны по-разному. Первая форма директивы:
#include "файл"
Эта форма директивы задает модуль, который должен находиться в текущем каталоге — в том же, где и транслируемый файл main.cpp. Вообще-то говоря, можно поместить подключаемый файл в любой каталог, но тогда нужно указывать полное имя, например:
Mc:\\Piter\\partl\\ch01\\TStack.cpp" nc:/Piter/partl/ch01/TStack.cppH
Оба варианта эквивалентны. Вторая форма директивы: #include<файл>
Эта форма применяется для включения стандартных библиотечных файлов. Указанный таким образом файл должен находиться в стандартном каталоге интегрированной среды include. Мы могли бы и файл с классом TStack поместить туда же — тогда можно было бы написать директиву включения как системную:
#include<TStack.cpp>// наш файл
Однако лучше не «засорять» системные каталоги собственными файлами.
Имя файла нужно указывать абсолютно точно, иначе файл не будет найден. Пробелы внутри угловых скобок или внутри кавычек — значимы, поэтому без необходимости дополнительные пробелы писать нельзя.
После директив #i nclude написана директива usi ng, которую мы неоднократно прописывали в начале программы, не очень задумываясь, зачем это необходимо. С помощью этой директивы мы подключаем стандартное пространство имен (namespace), в котором прописаны все стандартные классы, переменные, константы, функции, макросы.
Опубликовал Kest
January 15 2014 11:59:53 ·
4 Комментариев ·
4691 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
UiUser January 15 2014 13:44:49
Самое главное при разбивании на модули - это никогда, слышите, никогда не забывать #pragma once прописать)) И запомнить раз и навсегда, что свои заголовочники подключаются в парных ковычках, а не в угловых скобках)) Иначе будет потом печаль, беда и ошибка компиляции. Проверено мной, еще тем балбесом
Coder January 15 2014 15:31:10
Я думаю, что при ручной сборке текстов могут посыпаться различные ошибки при компиляции и исполнении исходного кода. А можно как-нибудь автоматизировать данный процесс во избежание возникновения различных ошибок и крушении программы? Интересует можно ли это сделать в Microsoft Visual Studio 2010? Заранее спасибо.
Максим January 15 2014 15:32:42
Хорошая инфа. Не мог понять, почему у меня это не получается, пока не прочитал статью. UiUser, кстати, твои советы тоже пригодились
Леонид January 20 2014 15:06:17
Полезная статья. У меня тоже не получалось до этой статьи. Долго мучился с кодом. А тут, зайдя на сайт, увидел ее, прочитал ее, попробовал на небольшой программке - получилось! Странно, все же почему довольно таки простые вещи не приходят в голову сразу, приходится ломать кучу копий, не спать ночами, совершать кучу ошибок, а на самом деле-раз и все просто. Спасибо за инфу.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.