Void CPerson::setBirthDate(int Day, int Month, int Year)
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

{

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, просмотров: 201.