Практическая работа №16. Реализация раздельной компиляции.
Цель: изучение принципов раздельной компиляции в языке С++.
Оборудование: ПК.
Задание:
-
Для задачи,выполненной в практической работе №15, выполнить разбиение кода на три файла:
-
интерфейсную часть, содержащую объявление класса, разместить в заголовочном файле с расширением .h;
-
реализацию класса, содержащую описание функций класса, разместить в файле с расширением .cpp (имя файла должно совпадать с именем заголовочного файла).
-
программу, использующую класс, разместить в файле с расширением .cpp.
-
При выполнении задания следует руководствоваться предложенным примером – обратите внимание на выделенные команды.
-
Выполнить компиляцию файла реализации и файла программы с помощью команды: c++ -c имя_файла_1.cpp имя_файла_2.cpp.
-
Скомпоновать файлы с помощью команды: c++ имя_файла_1.o имя_файла_2.o -o имя_исполняемого_файла.
-
Протестировать работу программы.
-
Оформить отчет, который должен содержать:
-
тему;
-
цель;
-
оборудование;
-
задание;
-
исходный код программы;
-
результаты работы программ;
-
вывод.
Пример:
//Заголовочный файл dayyear.h
//Это интерфейс класса DayOfYear
#ifndef DAYYEAR_H
#define DAYYEAR_H
class DayOfYear
{
public:
friend bool equal(DayOfYear date1, DayOfYear date2);
//Предусловие:аргументы date1 и date2
// содержат значения
//Возвращает true, если значения аргументов
// date1 и date2 представляют одну и ту же дату,
// иначе - false
void input();
void output();
DayOfYear(int new_day, int new_month);
// Предусловие: значения аргументов new_day
// и new_month составляют допустимую дату.
// Постусловие: дата изменена в соответствии
// со значениями аргументов.
DayOfYear();
// Инициализирует дату значением 1 января
int get_month();
// Возвращает порядковый номер месяца:
// 1 для января, 2 для февраля и т. д.
int get_day();
// Возвращает номер дня месяца.
//Это часть реализации, а не интерфейса.
private:
void check_date();
// Проверка даты
int day;
int month;
};
#endif //DAYYEAR_H
//Файл реализации dayyear.cpp
#include <iostream>
#include <cstdlib>
#include "dayyear.h"
using namespace std;
bool equal(DayOfYear date1, DayOfYear date2)
{
return (date1.month == date2.month
&&date1.day == date2.day);
}
DayOfYear::DayOfYear(int new_day, int new_month)
:day(new_day),month(new_month)
{
check_date();
}
DayOfYear::DayOfYear():day(1), month(1)
{
}
void DayOfYear::input()
{
cout << "Введите день месяца: ";
cin >> day;
cout << "Введите месяц как число: ";
cin >> month;
// Закрытые поля могут применяться
// только в определениях методов
check_date();
}
void DayOfYear::output()
{
cout << "день = " << day
<< ", месяц = " << month << endl;
}
// Метод check_date проверяет не все возможные
// способы неверного задания даты, но её можно
// дополнить, чтобы проверка была исчерпывающей
void DayOfYear::check_date()
{
if ((month < 1) || (month > 12)
|| (day < 1) || (day > 31))
{
cout << "Некорректная дата.\n"
<< "Работа программы завершена.\n";
exit(1);
}
}
int DayOfYear::get_month()
{
return month;
}
int DayOfYear::get_day()
{
return day;
}
//daydemo.cpp
//Файл программы, использующей класс DayOfYear
#include <iostream>
#include "dayyear.h"
using namespace std;
int main()
{
DayOfYear today, birthday(10,1);
cout << "Введите текущую дату\n";
today.input();
cout << "Сегодня: ";
today.output();
cout << "Ваш день рождения: ";
birthday.output();
if (equal(today, birthday))
cout << "С Днем рождения!\n";
else
cout << "Не жди гостей!\n";
return 0;
}
Контрольные вопросы:
-
Что такое класс?
-
Как объявить класс?
-
Как описать метод класса?
-
Как объявить объекты?
-
Как инициализировать объект?
-
Как обратиться к полям класса?
-
Как выполняется операция присваивания для объектов?
-
Что такое конструктор?
-
Как объявить конструктор?
-
Что такое дружественная функция?
-
Как объявить дружественную функцию?
-
Как определить дружественную функцию?
-
Как выполнить перегрузку оператора?
-
Что такое интерфейс класса?
-
Что такое реализация класса?
-
Как выполнить компиляцию нескольких файлов?
-
Как выполнить компоновку нескольких файлов?
-
Как выполняются операторы, использованные в программе?