- •Овсянник в.Н. Лабораторные работы по курсу «Объектно-ориентированное программирование»
- •1.Интегрированная среда mvs-2010
- •1.1.Методические указания
- •2.Массивушки и подпрограммочки
- •Прочитайте это задание и методические указания до конца, прежде чем терзать клавиатуру, соседа, преподавателя и пр. Сущности
- •Попробуйте сдать работу, предварительно тщательно протестировав ее на предмет отсутствия хомутов
- •2.1.Методические указания
- •3.Поиск экстремумов с ограничениями или «Брачное агенство»
- •Постановка задачи
- •Задание
- •Листинг файла mAgency.Cpp (с главной функцией)
- •Листинг файла Lib.H
- •Листинг файла Lib.Cpp
- •4.Задача «куча камней»
- •4.1.Постановка задачи.
- •4.2.Методические указания.
- •Некоторые примеры разделения камней на две кучи, которые должна решать ваша программа
- •5.Разработка простого класса
- •5.1.Задание
- •5.2.Описание вариантов заданий
- •5.3.Драгоценные методические указания
- •6.Класс вектор
- •6.1.Пример класса tVector
- •6.2.Класс tVector с перегруженными операциями
- •7.Наследование классов
- •7.1.Задание
- •7.2.Методическая помощь
- •7.3.Описание самых легких вариантов заданий
- •7.4.Контроль качества выполненной работы
- •8.Приложение с окном вида
- •9.Абстрактные классы и виртуальные функции
- •9.1.Задание
- •9.2.Методические указания
- •Void PrintClassNamе1(cBasе *pb) // параметр-указатель
- •Void PrintClassNamе2(cBasе &b) // параметр-ссылка
- •Void PrintClassNamе3(cFirst f) // параметр-значение
- •9.3.Варианты заданий
- •10.Разработка класса контейнера
- •10.1.Задание
- •10.2.Описание вариантов заданий
- •10.3.Методические указания
- •12.Перегрузка векторных и матричных операций
- •12.1.Задание
- •12.2.Бесценные методические указания
- •12.3.Некоторые особенности перегрузки операций
- •12.4.Варианты заданий
- •13.Программирование односвязного списка
- •13.1.Задание
- •13.2.Описание вариантов заданий
- •14.Приложение, основанное на модальном диалоговом окне
- •14.1.Нудные методические указания Модальные и немодальные диалоговые окна
- •Ресурсы и элементы управления
- •Сценарий создания приложения
- •Разбор приложения
- •Усовершенствование приложения
- •15.Приложения
- •15.1.Виды сортировок
- •Классификация сортировок
- •Сортировка массивов
- •15.2.Алгоритм сортировки включением
- •Пример сортировки с помощью прямого включения
- •15.3.Сортировка Шелла
- •Список литературы
7.2.Методическая помощь
Очевидно, что в программе вам понадобится описать массив объектов класса и работать с ним. Допустим, вы сделали такие описания:
class CMyTrouble: public CMyLove
{
char *LoverName;
public:
CMyTrouble():CMyLove()
{/**/}
CMyTrouble(char * iName, int iSome):CMyLove(iSome)
{/**/}
// ...
};
// ...
const int Max=20;
CMyTrouble List[20]; /*Так можно описать массив объектов только в том случае, если в классе определен конструктор без параметров */
// ...
Теперь, когда вы будете помещать объект в массив List с помощью внешне безобидного оператора
List[i]=CMyTrouble(SomeName, iNum);
то столкнетесь с определенными неприятностями, если, как в данном примере, среди член-данных есть указатели. Эти неприятности вызваны тем, что при выполнении указанного оператора будут вызываться деструктор, конструктор копирования и собственно операция присваивания. Вследствие того, что реализации деструктора, конструктора копирования и операции присваивания «по умолчанию» в данном случае неприменимы, вам придется их реализовывать самостоятельно, что само по себе, конечно, полезно, но «морочливо». Конечно, если вы их разработаете, то можете просить у преподавателя дополнительные баллы за свой «сугубо индивидуальный» труд.
Другим выходом является использование массива указателей на объекты:
const int Max=20;
CMyTrouble *List[20];
// ...
Теперь можно помещать объект в массив List с помощью оператора
List[i]=new CMyTrouble(SomeName, iNum);
В таком случае вам можно обойтись без перегрузки операции присваивания и конструктора копирования, хотя деструктор придется разработать, ничего не поделаешь. Кроме того, надо не забыть выполнить освобождение памяти от объектов в массиве List.
Еще одно замечание, касающееся использования символов кириллицы. Если файл с исходными данными ваших объектов вы создавали с помощью редактора среды MVS или блокнота, то символы кириллицы записаны в кодировке Windows. У вас не будет проблем с символами кириллицы, если вы в своей программулине вызовите хвункцию
setlocale(LC_ALL, "Rus");
Но, когда вы в программе будете вводить символы кириллицы с помощью потока cin, то вы их получите в кодировке DOS, а не Windows. Тогда при записи таких символов в файл надо использовать, например, такую функцию
char Buff[1024];
char * Rus(char *Str)
{
OemToCharA(Str,Buff);
return Buff;
}
В качестве иллюстрации этого обстоятельства обратите внимание на следующий непростой случай записи данных в файл:
char FName[20], SName[20];
cout<<"Введи имя>";
cin>>FName;
cout<<"Введи фамилию>";
cin>>SName;
// запись данных в файл (out - объект ostream)
out<<Rus(FName)<<' '<<Rus(SName)<<' '<< /* и так далее*/;
Когда вы посмотрите на содержимое файла, то обнаружите там, что имя и фамилия совпадают! Этот глюк исправить можно таким простым способом:
out<<Rus(FName)<<' '; out<<Rus(SName)<<' '<< /* и так далее*/;
Если вы объясните причину такого явления, то можете через суд требовать от хвирмы Микрософт милльёны за глюк в их компиляторе, который вы купили за огромные деньжищи.
Кстати, еще один вопросец. Приведенная выше реализация функции Rus предполагает, что длина преобразуемой строки символов не превышает магического числа 1023. А если она будет больше, что делать? В принципе длина строки символов с завершающим нулем (тип char*) может иметь размер до 2ГБ. Найдете выход?
