{
m_dBirthDate.setDay(Day);
m_dBirthDate.setMonth(Month);
m_dBirthDate.setYear(Year);
}
Int CPerson::getBirthDay()
{ return m_dBirthDate.getDay(); }
Int CPerson::getBirthMonth()
{ return m_dBirthDate.getMonth(); }
Int CPerson::getBirthYear()
{ return m_dBirthDate.getYear(); }
В приведенном листинге класса CPerson обратите особое внимание на реализацию конструктора и деструктора класса, в которые добавлены макросы TRACE для отслеживания последовательности их вызовов.
Проведем эксперимент: создадим консольное приложение, подключим к нему заголовочный файл Person . h и добавим в главную функцию следующий код:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
// ...
CPerson *pPers;
pPers=new CPerson;
delete pPers;
// ...
}
После запуска приложения на выполнение в окне Debug мы увидим следующие строки:
Constructor CDate was called
Constructor CPerson was called
Destructor ~CPerson was called
Destructor ~CDate was called
Этот эксперимент дает ответ на вопрос о том, когда вызываются конструктор и деструктор «внутреннего» объекта, в данном случае объекта класса CDate, по отношению к вызовам конструктора и деструктора «внешнего» объекта – экземпляра класса CPerson.
А если внутренний объект имеет конструктор с параметрами, то где этот конструктор должен быть вызван? Добавим в класс CDate конструктор с параметрами:
// Файл Date.h
#pragma once
Class CDate
{
public :
CDate(void);
CDate(int iDay, int iMonth,int iYear);
// ...
};
==========================================================================
// Файл Date.cpp
CDate::CDate(int iDay, int iMonth,int iYear)
{
m_nDay=iDay; m_nMonth=iMonth; m_nYear=iYear;
TRACE("Constructor CDate was called\n");
}
Если при этом не удалить конструктор класса CDate по умолчанию, т.е. без параметров, то приложение будет компилироваться без ошибок, но если конструктор по умолчанию удалить, то возникнет сообщение об ошибке:
Error C2512: 'CDate' : no appropriate default constructor available
Перевод: для класса CDate не определен конструктор по умолчанию. Компилятор при этом будет указывать на конструктор класса CPerson. Конструктор внутреннего объекта CDate с параметрами должен быть вызван, например, в следующем контексте:
CPerson::CPerson(void)
: m_sFName(NULL)
, m_sSName(NULL)
, m_dBirthDate(0,0,0)
{
TRACE("Constructor CPerson was called\n");
}
В этом случае программа будет компилироваться без ошибок и конструктор класса CDate с параметрами будет вызван на выполнение точно так же, как и конструктор без параметров. Для того чтобы конструктору класса CDate передать требуемые параметры, определенные пользователем класса CPerson, можно, например, путем создания конструктора класса CPerson с параметрами:
CPerson::CPerson(int iDay, int iMonth, int iYear)
: m_sFName(NULL)
, m_sSName(NULL)
, m_dBirthDate(iDay, iMonth, iYear)
{
TRACE("Constructor CPerson with parameters was called\n");
}
|
Перегрузка векторных и матричных операций
По мере увеличения размера программы средняя наработка на отказ постоянно уменьшается
Закон Мерфи
Цель работы – практически освоить программирование перегрузки операций на примере выполнения математических операций над векторами и матрицами (4 час.).
Задание
Разработайте консольное приложение, а если хотите – приложение с графическим интерфейсом пользователяJ, в котором реализуются операции над векторами и матрицами, оформленные как перегруженные «классовые» операции в соответствии с вашим индивидуальным заданием. Само собой разумеется, что вы должны разработать классы матриц и векторов и в них реализовать перегруженные операции. Для хранения значений элементов матриц и векторов необходимо использовать указатели.
Любое приложение должно предоставлять очеееень привередливому пользователю, например, тому же добрейшему преподуL, следующие бесплатные, т.е. даровые, услуги:
Ø возможность многократно вводить исходные данные и получать результат без выхода из приложения, т.е. без его перезапуска на выполнение;
Ø возможность ввода размеров векторов, матриц и других параметров;
Ø реализовать перегруженную операцию [] доступа к элементам векторов и матриц;
Ø в каждом варианте задания необходимо реализовать перегруженные операции как компонентные функции, дружественные и глобальные;
Ø наглядный вывод, чтобы было понятно даже самому тупому юзеру, исходных данных и результатов выполнения операций в соответствии с доставшимся вам самым легким вариантом задания. Операции вывода значений векторов и матриц на монитор реализовать как перегруженные.
Вывод программы должен быть максимально наглядным. Например, если в программе реализуется операция умножения двух матриц, то лучше всего вывод программы организовать в следующем виде:
Обратите внимание, что здесь проиллюстрирована операция умножения матриц и результирующая матрица «настоящая».
Дата: 2019-07-30, просмотров: 241.