По ошибке с указанием в качестве возможной причины на



 разрушение heap */

_gеtсh();

rеturn nRеtCodе;

}

 

Намотайте на ус, что в операторе obj=new CFirst указатель на объект obj объявлен как имеющий тип CBase, но создается объект производного типа CFirst! Подобным образом должны действовать и вы при выполнении своего индивидуального задания.

С этим все понятно, так? Но вот первая проблема: создается объект класса CSecondс помощью оператора CFirst * fobj=new CSecond, как и положено, вызываются конструкторыCFirst иCSecond(именно в этой последовательности, в соответствии со спецификацией языка), но вот при выполнении оператора PrintClassName3(*fobj)вызываются только деструкторы ~CFirst и~CBase, а вот деструктор ~CSecond не вызывается, хотя должен бы, уродина! То, что при этом не вызываются конструкторы при передаче объекта как параметра функции – песнь отдельная (см. методический материал л.р. «Перегрузка векторных и матричных операций»).

Как печальный результат, выполнение оператора delete fobjприводит к (повторному!) вызову деструктора класса ~CFirstи снятию программы по ошибке при выполнении оператора освобождения памяти в этом деструкторе. Если же убрать оператор PrintClassName3(*fobj), то после завершения программы обнаружатся утечки памяти.

В чем же причина или как следует обеспечить корректный вызов деструкторов в том случае, когда объект объявляется как имеющий тип базового класса, а создается с помощью конструктора производного, как в программе:

  CBase *obj;

obj=new CFirst;

 

Выход очень простой: надо объявить конструкторы классов иерархии виртуальными, причем достаточно это сделать только в базовом классе. Проверьте!

Варианты заданий

В каждом варианте предусмотреть ввод данных с клавиатуры (с подсказками) или чтение из файла. Вывод результатов также нужно оформить с подсказками.

Таблица 1.

Индивидуальные задания

Задание
1 Разработать абстрактный БАЗОВЫЙ класс с виртуальной функцией, вычисляющей площадь плоской фигуры. Разработать производные классы: ПРЯМОУГОЛЬНИК, КРУГ, ПРЯМОУГОЛЬНЫЙ ТРЕУГОЛЬНИК и ТРАПЕЦИЯ со своими функциями вычисления площади. Для справки: площадь трапеции равна S=(a+b)*h*0.5, а формулы площадей других фигур надо помнить наизусть
2 Разработать абстрактный БАЗОВЫЙ класс с виртуальной функцией, вычисляющей норму. Разработать производные классы: КОМПЛЕКСНОЕ ЧИСЛО (норма есть корень квадратный из суммы квадратов действительной и мнимой частей), ВЕКТОР (корень квадратный из суммы элементов) и МАТРИЦА (максимальное значение по модулю)
3 Разработать абстрактный класс КРИВАЯ с виртуальной функцией вычисления зависимости y(x). Разработать производные классы: ПРЯМАЯ (y=a*x+b), ЭЛЛИПС (x2/a2+y2/b2=1) и ГИПЕРБОЛА (x2/a2-y2/b2=1). В каждом производном классе реализовать виртуальную функцию y(x)
4 Разработать абстрактный БАЗОВЫЙ класс с виртуальной функцией вычисления суммы прогрессии. Разработать производные классы АРИФМЕТИЧЕСКАЯ ПРОГРЕССИЯ и ГЕОМЕТРИЧЕСКАЯ ПРОГРЕССИЯ. Каждый класс должен иметь два поля вещественного типа: первое – значение начального элемента прогрессии, второе – шаг для арифметической прогрессии и множитель – для геометрической. Определить функцию вычисления суммы с параметром n: число элементов прогрессии. Арифметическая прогрессия: ai=a0+i*h, sn=(n+1)*(a0+an)/2. Геометрическая прогрессия: ai=a0*hi, sn= (a0-an*h)/(1-h)
5 Разработать абстрактный базовый класс ФИГУРА с виртуальной функцией вычисления площади и периметра фигуры. Разработать производные классы ПАРАЛЛЕПИПЕД, СЕКТОР КРУГА и УСЕЧЕННЫЙ СЕКТОР КРУГА. Определить в производных классах функции вычисления площади и периметра перечисленных фигур
6 Разработать абстрактный базовый класс РАБОТНИК и производные классы РАБОТНИК С ПОЧАСОВОЙ ОПЛАТОЙ и СЛУЖАЩИЙ С ОКЛАДОМ. Определить в классах соответствующие компонентные данные. Определить виртуальные функции начисления зарплаты за указанный период времени
7 Разработать абстрактный базовый класс ТЕЛО с виртуальной функцией вычисления площади поверхности. Разработать производные классы ПРЯМОУГОЛЬНЫЙ ПАРАЛЛЕЛИПИПЕД, ТЕТРАЭДР и ШАР с функциями вычисления площади поверхности S. Площадь поверхности параллелепипеда S=2*(a*b+b*c+c*a), где a,b,c – ребра. Площадь поверхности шара S=4*π*r2. Площадь поверхности тетраэдра S=a2*√3, где а – длина ребра
8 Разработать абстрактный базовый класс ТЕЛО с виртуальной функцией вычисления объема тела. Разработать производные классы ПАРАЛЛЕЛИПИПЕД, ПИРАМИДА, ТЕТРАЭДР и ШАР с функциями вычисления объема V. Объем прямоугольного параллелепипеда V=a*b*c, правильной пирамиды V=a*b*h/3 (a,b – стороны прямоугольной основы, h – высота), тетраэдра V=12*a3*√2 (а – длина ребра), шара V=4*π*r3/3
9 Разработать абстрактный базовый класс МЛЕКОПИТАЮЩИЕ с виртуальной функцией описания конкретного объекта класса. Разработать производные классы ЖИВОТНОЕ и ЧЕЛОВЕК. Для класса ЖИВОТНОЕ определить производные классы ЛОШАДЬ и КОРОВА. Определить виртуальные функции, возвращающие описания человека, лошади и коровы
10 Разработать абстрактный базовый класс БАНКОВСКИЙ СЧЕТ с виртуальной функцией, возвращающей величину счета. В базовом классе определить величину счета и дату его открытия. Разработать производные классы ДЕПОЗИТ и КРЕДИТ, в которых необходимо определить величину процентной ставки и дату для начисления величины вклада или суммы долга. Для производных классов разработать виртуальные функции, которые должны вычислять сумму депозита или сумму платежа в зависимости от типа класса: ДЕПОЗИТ или КРЕДИТ. Если вы еще не пользовались кредитами или депозитами, то знайте, что проценты обычно задают в годовом исчислении. Это значит, например, что если процент по кредиту равен 35 и вы погашаете его через месяц, то банк вам начислит пеню, равную (сумма кредита)*0.35*30/365
11 Разработать абстрактный базовый класс МАССИВ с виртуальными абстрактными функциями, возвращающими сумму значений элементов массива, максимального и минимального значений. Разработать производные классы ВЕКТОР и МАТРИЦА. В этих классах определить функции формирования значений массивов по определенному закону, которые надо задать самостоятельно, а также определить реализацию функций, возвращающих сумму значений элементов массива, максимального и минимального значений
12 Разработать абстрактный базовый класс СТУДЕНТ с виртуальной функцией, возвращающей сумму дохода студента за указанное число месяцев. В базовом классе определить член-данное фамилия студента. Разработать производные классы СТИПЕНДИАТ и КОНКРАТНИК. Для класса СТИПЕНДИАТ виртуальная функция должна вычислять сумму стипендии за указанный промежуток времени, а для класса КОНКРАТНИК – сумму платежа.   

Разработка класса контейнера

В любой программе всегда есть еще одна ошибка

Закон Мерфи


Цель работы – освоить разработку и использование контейнерного класса, который содержит в качестве член-данного другой класс (4 час.).

 

Задание

Разработайте собственный контейнерный класс в соответствии с вашим счастливым вариантом задания (см. табл. 4.1). В качестве член-данного класс должен содержать класс TVector, разработанный Вами в предыдущей работе, и использовать его для хранения данных.

При выполнении любого варианта задания предусмотреть такую реализацию программы, использующей разработанный вами класс, которая бы позволила убедиться в корректности реализации методов класса. В частности, во всех вариантах должен быть реализован метод вывода на монитор всех элементов массива и их количества.

Обязательно следует реализовать два варианта вашего класса: использование класса TVector с конструктором без параметров и с конструктором с параметрами.

Если в вашем задании не оговорен конкретно тип обрабатываемых данных, то он может быть любым числовым. Другими словами, объявляйте тип данных как ElemType, который описан в файле TVector.h.

Разработанный вами класс должен размещаться в отдельных файлах (.h и .cpp).

В качестве примера реализации класса Стек смотрите программу Stck.exe.

Описание вариантов заданий

Таблица 4.1.

Варианты заданий

№ вар. Задание
1,8 Класс Стек (CStack) со следующими методами:
  • запись данного в стек (Push);
  • извлечение данного из стека (Pop);
  • вывод содержимого стека на монитор (Print);
  • получение числа данных в стеке (Size);
  • проверка стека на наличие в нем данных (Empty).
Класс Стек представляет собой такую структуру данных, в которой реализуется правило «первым пришел – последним вышел»
2,9 Класс Очередь (CQueue) с такими же методами, как и класс Стек. Этот класс представляет собой такую структуру данных, в которой реализуется правило «первым пришел - первым вышел»
3,10 Класс Очередь с приоритетом (CPriorityQueue) с такими же методами, как и класс Очередь. Отличительной чертой этого класса является то, что самый большой элемент всегда находится в начале очереди, т.е. данные в очереди упорядочены.
4,11 Класс Ассоциативный массив (CMap), каждый элемент которого имеет не целочисленный индекс, а «имя», представляющее собой строку символов. Когда числовое значение заносится в массив, для него указывается также имя. Аналогичным образом извлечение данного из массива также выполняется по его имени. Для облегчения решаемой задачи можно принять некоторые допущения:
  • длина имени ограничена, например, 5 символами;
  • каждое имя предполагается оригинальным;
  • число элементов массива ограничено, например, 100.
Из этого следует, что имена элементов массива можно хранить в двумерном массиве, например, char Names[100][6] или char *Names[100]. Массив указателей предпочтительнее, так как позволит не накладывать ограничение на число символов в имени.
5,12 Класс Массив (CArrChar), предоставляющий возможность задания индексов массива символьного типа. Конструктор класса должен получать в качестве параметров начальный и конечный индексы массива как данные символьного типа. Методы добавления, получения, вставки, удаления элементов массива должны получать в качестве параметра индекс массива символьного типа.
6,13 Класс Массив(CArrInt), предоставляющий возможность задания начального и конечного индексов массива как целых чисел. Конструктор класса должен получать в качестве параметров начальный и конечный индексы массива. Методы добавления, получения, вставки, удаления элементов массива должны получать в качестве параметра индекс массива целочисленного типа.
7,14 Класс Кольцо (CRing), предназначенный для хранения и обработки данных числового типа как массива. Отличительной особенностью класса является тот факт, что класс всегда «помнит» текущий индекс массива и при добавлении нового элемента массива вставляет его вслед за текущим и делает новым текущим, а при получении значения текущего элемента массива автоматически перемещается к следующему. Когда текущим становится последний элемент массива, то после получения его значения текущим должен стать первый элемент массива.

 

Методические указания

В качестве иллюстрации контейнерного класса рассмотрим следующий пример. Пусть имеется класс CDate, который поддерживает обработку дат (день, месяц и год):

// Файл Date.h

#pragma once

class CDate

{

public:

CDate(void);

~CDate(void);

void setDay(int newDay);

void setMonth(int newMonth);

void setYear(int newYear);

int getDay();

int getMonth();

int getYear();

private:

int m_nDay;

int m_nMonth;

int m_nYear;

};

 

Реализацию этого класса разместим, как принято, в cpp-файле:

// Файл Date.cpp

#include "StdAfx.h"

#include "Date.h"


Дата добавления: 2018-02-18; просмотров: 517; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!