Разработка программы учета пассажиров в поездах, страница 3

Класс «Manager» представляет собой объектную модель некоторого управляющего, занимающегося управлением пассажиропотоком.

На этот класс возложены основные функции данной программы : добавление пассажиров в общую базу данных, удаление их из базы, редактирование записей.

Сама база реализована на основе стандартного контейнера библиотеки STL (Standart Template Library)  vector.

class Manager

{

private:

vector<Passenger> pass_list;

unsigned int records_total;

...

}

Этот контейнер является наиболее универсальным средством при создании коллекции типа «массив».

Также в классе представлено 6 функций для непосредственной работы с содержимым базы и 2 функции для сохранения и чтения базы на диск.

bool add_record(const Passenger&);

bool delete_record(unsigned int);

bool edit_record(unsigned int,string,unsigned int,unsigned int, unsigned      int,unsigned int);

void find_name(string);

void find_ticket(unsigned int);

void find_carriage(unsigned int);

...

bool save_base(const char* path);

bool load_base(const char* path);

Функция add_record добавляет запись типа Passenger в базу.

Непосредственно перед добавлением осуществляется просмотр базы на предмет элемента с такими же полями, а именно : номером билета и конкретным местом в конкретном вагоне. Именно эти 2 критерия позволяют отличить одного пассажира от другого в базе данных.

Просмотр базы осуществляется с помощью специальной абстракции – итератора.

vector<Passenger> :: iterator itr;

Она позволяет “перебирать” элементы контейнера по номерам. Для каждого контейнера и для типа данных содержащегося в этом контейнере создается соответственно свой итератор.

Если элемент уникален, то есть в базе нет такого же (в рамках предложенных выше критериев), то мы вызываем стандартную функцию контейнера vector – push_back для добавления элемента.

Функция delete_record удаляет запись из базы данных. В функцию передается номер удаляемого элемента. Сначала проверяется, не выходит ли этот номер за пределы допустимые пределы [1; records_total], и не пуста ли сама база (records_total = 0). Далее, если не выполняются вышеперечисленные условия (мы можем корректно произвести удаление), то с помощью описанного выше итератора осущетсвляется последовательный переход к нужному номеру и вызов стандартной функции конейтера для удаления элемента – erase.

Функция edit_record занимается редактированием записи в базе данных. Ей передаются новые параметры объекта (имя, номера и т.д.) и номер записи, подлежащей редактированию. Перед редактированием мы опять проверяем, не выходит ли номер редактируемого элемента за допустимые пределы и не пуста ли база данных. Далее при  помощи  стандарной функции контейнера at, позволяющей получить доступ к конкретнему номеру элемента, мы вызываем для данного элемента функции изменения его полей:

(pass_list.at(num - 1)).set_age(a);

(pass_list.at(num - 1)).set_carriage(c);

(pass_list.at(num - 1)).set_name(n);

(pass_list.at(num - 1)).set_place(p);

(pass_list.at(num – 1)).set_ticket(t);

Функции find_name, find_place, find_carriage – схожии в реализации функции, предназначенные для поиска элемента базы, отвечающего нужному требованию – имени, номеру места, номеру вагона.

При помощи итератора проводится последовательный перебор элементов контейнера и сравнения их параметров в заданным.

if((*itr).get_ticket() == num)

if((*itr).get_carriage() == num)

if((*itr).get_name() == name)

На экран выводится все совападения, либо же информация о том, что таковых элементов не найдено.

Функция save_base выполняет сохранение базы на диск.

Ей передается константная ссылка на массив символов, определяющих путь сохранения.

По данной ссылке созадется стандартный выводной поток.

std :: ofstream strm(path);