Якщо тип класу – Circle(if(typeid(*(*it))==typeid(Circle))) – тоді в файловий рядок записуюється «C» та за допомогою перегруженого оператора ostream& operator<<( ostream& os, Figure& f ) виконується запис у файл конкретного екземпляру класу: out <<(*((Circle*)(*it))); Якщо тип класу – Elipse – ті ж самі дії, тільки замість Circle пишемо Elipse.
Void Programm:: load(); - завантажує колекцію з файлу. Викликає функцію int Programm::readFigures(deque <Figure*> &figures), яка повертає кількість зчитаних фігур. У середині файлу створюється файловий потік та відкривається для читання : ifstream in("figures.dat");
Об’являються змінні –
Circle* c; // Показчик на Circle
Elipse* e; // Показчик на Elipse
int count=0; // Кількість зчитаних фігур
string line; // Строковий рядок для читання з файлу
string objType; // Тип об’єкту
У циклі, доки не кінець файлу, зчитується рядок, та перевіряється перший символ, який відповідає за тип файлу :
getline(in, line);
objType = line.substr(0, 1);
line.erase(0, line.find('\t')+1);
Якщо тип об’єкту – Circle, то виділяється пам’ять під Circle, за допомогою string& operator>>(string& line, Figure& f) ідє зчитування об’єту з фалу. Після чого він додається до колекції.
if(objType == "C"){
c = new Circle();
line >> (*c);
figures.push_back(c);
count++;
}
Так само і з об’єктом типу Elipse:
if(objType == "E"){//Это объект Elipse
e = new Elipse();
line >> (*e);
figures.push_back(e);
count++;
}