- •Мгул, пм-21, 4 семестр, 2012 год
- •Контрольная работа №2
- •Class Command (Calculator) (лаб. Раб. №3)
- •Задание * (лаб. Раб. №4)
- •Дать описание классов, созданных в файлах: Array.H, Array.Cpp
- •12.1. Исходный код файла Array.H (лаб. Раб. №5)
- •12.2. Исходный код файла Array.Cpp (лаб. Раб. №6)
- •Выполнить задание (лаб. Раб. №7)
- •Дать описание классов проекта Kolobok («Колобок») (лаб. Раб. №8)
- •В проект Kolobok добавить персонаж RedCup («Красная шапочка») (лаб. Раб. №9)
Задание * (лаб. Раб. №4)
На прошлом занятии была написана система классов наследников от класса Command, реализующая вычислительный алгоритм. Сегодня предлагается реализовать сохранение таких алгоритмов в файл и загрузку из файла. Для сохранения/загрузки каждого конкретного объекта, необходимо в классах сделать виртуальные методы store и load. Можно пользоваться файловым потоком fstream или библиотекой для работы с файлами из <stdio.h> (fopen, fread, fwrite, fclose).
Для идентификации классов предлагается ввести enum, например:
enum Types { Command, Plus, … },
либо их строковые обозначения, например:
“Command”, “Plus”,
и сделать у каждого класса виртуальный метод, который возвращал бы его идентификатор. Также можно пользоваться GUID (для тех, кто знает, что это такое).
Предполагаемый алгоритм сохранения системы:
Записать в файл количество классов.
Для каждого класса записать в файл его идентификатор, а затем вызвать его виртуальный метод store, который сохранит его параметры.
Предполагаемый алгоритм загрузки системы:
Из файла читается количество классов.
Для каждого класса читается его идентификатор, далее возможны варианты
По идентификатору-числу (из enum) делается switch, либо по идентификатору-строке делается if-elseif и создаётся экземпляр нужного класса.
Заранее заведена так называемая фабрика классов – массив, в котором содержится по одному экземпляру каждого класса (пустышки). У каждого класса есть виртуальный метод, который создаёт экземпляр класса такого же типа, как и он сам. По считанному идентификатору в фабрике находится нужная пустышка и с её помощью создаётся новый экземпляр класса. Для идентификаторов-чисел можно сразу обращаться к нужному элементу массива. Для идентификаторов-строк можно пользоваться хеш-таблицами либо последовательным поиском.
Для созданного экземпляра класса вызывается виртуальный метод load, который инициализирует его поля.
Загруженный алгоритм можно исполнять.
Дать описание классов, созданных в файлах: Array.H, Array.Cpp
12.1. Исходный код файла Array.H (лаб. Раб. №5)
#ifndef _MCC_Dimarius_Array
#define _MCC_Dimarius_Array
typedef void* pvoid;
typedef unsigned int uint;
class Array {
void **data;
static const pvoid DUMMY;
uint userlen, length;
void changeSize(uint newSize);
public:
uint delta;
// __declspec(property(get = GetSize, put = SetSize)) uint len;
uint GetSize() { return userlen; }
void SetSize(uint newSize);
Array(uint Delta = 1, uint Count = 0);
~Array();
Array &Insert(pvoid whatToAdd, uint whereAdd);
int Add(pvoid whatToAdd);
Array &operator << (pvoid whatToAdd);
Array &operator >> (pvoid *whatToGet);
void clear() { changeSize(0); userlen = 0; }
void Remove(uint n);
void DelNULL();
void Sort(bool (*comp)(const void *o1, const void *o2));
void FastSort(bool (*comp)(const void *o1, const void *o2));
int Find(const void *o, bool (*comp)(const void *o1, const void *o2));
int FindInSorted(const void *o, int (*comp)(const void *o1, const void *o2));
pvoid &operator [](uint index);
};
#endif