Сериализация Калин Георгиев 13 май 2016 г. Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 1 / 23

Подобни документи
Указатели. Маисиви, указатели, параметри на функции Калин Георгиев 21 декември 2016 г. Калин Георгиев Увод в програмирането 21 декември 2016 г. 1 / 23

Обработка на грешки Изключения Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София Re

Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

Предефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически униве

Дефиниране на шаблон Шаблони (Templates) Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

Black and White

2. Лексически анализ. Основни понятия и алгоритъм на лексическия анализ. Програмна структура на лексическия анализатор Цел на упражнението Упражнениет

Потоци (Rev: 1.1)

Структура на програма в C - Част 9 - низове от символи, C-string

Входно/изходните операции са разширяеми. Лесно се реализират входно/изходни операции за типове, дефинирани от потребителя. Потоци (Rev: 1.1) Любомир Ч

2. Наследяване в C++ Съдържание Съдържание Наследяване (Rev: 1.2) Любомир Чорбаджиев 1 1 февруари 2007 г. 1 Наследяване 1 2

Lush Green

4

Програмен език C Пламен Танов Ненко Табаков Мартин Вачовски Технологично училище Електронни системи Технически университет София версия 0.5

Eclipse TUES 1 Кирил TUES

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA JAVA ОБЕКТИ Ненко Табаков Пламен Танов Технологическо училище Електронни системи Технически университет София 9 октомври

Виртуални функции

Lush Green

Програмиране на Паскал

Маисви

3. Синтактичен анализ. Граматика на учебен програмен език STUDENT. Извеждане на изречения от правилата на граматиката Цел на упражнението Упражнението

Homework 2

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 9 ноември 2016 г. Триф

При изпълнението на програма се извършват определени действия над данните, дефинирани в програмата.тези данни могат да бъдат постоянни ( константи ) и

Машинно обучение Лабораторно упражнение 3 Работа с функции, файлове и графики 1. Допълнителни сведения за функции 1.1. Стойности на аргументите по под

Структура на програма в C - Част 7 - масиви, оператор за индексиране, sizeof оператор

Title Tues 1 Кирил TUES

ОСНОВИ НА ЕЗИКА С# Интеграция на езиците за програмиране Една от най-добрите черти на.net Framework е възможността за интеграция на множество езици за

-

Структура на програма в C - Част 6 - goto, switch, break и continue клаузи

OpenGL

Упражнение 3. Основни елементи на РНР синтаксис на езика, константи, променливи, изрази, оператори... Показване на текст в браузъра Да се създаде една

C++

В компютърните системи информацията се съхранява само в двоичен код, използваните символи при съставяне на даден текст трябва да се представят като ко

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г ноември 2018 г. Трифон Трифонов (УП 18/19) Ма

Microsoft Word - Primer2_4.doc

Анализ и оптимизация на софтуерни приложения

doll Механична кукла Механичните кукли автоматично повтарят предварително зададена последователност от движения. В Япония има традиции в изработката н

Scan Tailor Кратко ръководство за работа Преди време описах как се работи с програмата Scan Kromsator. Сега искам да Ви представя една друга програма,

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 1

DADCM АНАЛОГОВО-ЦИФРОВ ПРЕОБРАЗУВАТЕЛ ЗА МОНТАЖ ВЪРХУ DIN ШИНА Инструкция за монтаж и работа

Лекции по Програмиране първа част I. Въведение в компютрите и програмирането КОМПЮТЪР = АПАРАТУРА + ПРОГРАМНО ОСИГУРЯВАНЕ Апаратна част Hardware(Харду

Препис:

Калин Георгиев 13 май 2016 г. Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 1 / 23

f «data; f» data; Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 2 / 23

Първо изискване: еднозначност ostream & operator << ( ostream & out, const DynArr <int >& ia) for ( int i = 0; i < ia. size ; i ++) out << ia.arr [i]; return out ; void test () DynArr <int > arr (5); //... ofstream out (" data. txt "); out << arr ; [1,20,301,4,5] => 12030145 Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 3 / 23

Първо изискване: еднозначност ostream & operator << ( ostream & out, const DynArr <int >& ia) for ( int i = 0; i < ia. size ; i ++) out << ia.arr [i] << " "; return out ; void test () DynArr <int > arr (5); //... ofstream out (" data. txt "); out << arr ; [1,20,301,4,5] => 1 20 301 4 5 Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 4 / 23

Второ изискване: локалност ostream & operator << ( ostream & out, const DynArr <int >& ia) for ( int i = 0; i < ia. size ; i ++) out << ia.arr [i] << " "; return out ; void test () DynArr <int > arr1 (3), arr2 (4); //... ofstream out (" data. txt "); out << arr1 << arr2 ; [1,2,3]; [4,5,6,7] => 1 2 3 4 5 6 7 Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 5 / 23

Второ изискване: локалност ostream & operator << ( ostream & out, const DynArr <int >& ia) out << "["; for ( int i = 0; i < ia. size -1; i ++) out << ia.arr [i] << ","; if ( ia. size > 0) out << ia.arr [ia.size -1]; out << "]"; return out ; void test () DynArr <int > arr1 (3), arr2 (4); //... ofstream out (" data. txt "); out << arr1 << arr2 ; [1,2,3]; [4,5,6,7] => [1,2,3][4,5,6,7] Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 6 / 23

Оптимизация: предвидимост [1,2,3]; [4,5,6,7] => [1,2,3][4,5,6,7] istream & operator >> ( istream & in, DynArr <int >& ia) DynArr <int > result (0); char c; int x; in >> c; assert (c == [ ); while (c!= ] && in. peek ()!= ] ) in >> x; result += x; in >> c; assert (c ==, c == ] ); ia = result ; return in; void test () DynArr <int > arr1 (0), arr2 (0); ifstream in (" data. txt "); in >> arr1 >> arr2 ; Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 7 / 23

Оптимизация: предвидимост ostream & operator << ( ostream & out, const DynArr <int >& ia) out << ia. length () << " "; for ( int i = 0; i < ia. size ; i ++) out << ia.arr [i] << " "; return out ; void test () DynArr <int > arr1 (5), arr2 (4); //... ofstream out (" data. txt "); out << arr1 << arr2 ; [1,2,3]; [4,5,6,7] => 3 1 2 3 4 4 5 6 7 Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 8 / 23

Оптимизация: предвидимост [1,2,3]; [4,5,6,7] => 3 1 2 3 4 4 5 6 7 istream & operator >> ( istream & in, DynArr <int >& ia) int newsize ; in >> newsize ; DynArr <int > result ( newsize ); for ( int i = 0; i < newsize ; i ++) in >> result [i]; ia = result ; return in; void test () DynArr <int > arr1 (0), arr2 (0); ifstream in (" data. txt "); in >> arr1 >> arr2 ; Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 9 / 23

на хетерогенни контейнери Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 10 / 23

Записване на хетерогенен контейнер във файл Figure *array[] DynArr < Figure *> arr [10]; file << arr ; file >> arr ; Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 11 / 23

Директен подход не работи ostream & operator << ( ostream & out, DynArr <Figure *>& a) out << a. length () << " "; for (int i = 0; i < a. length (); i++) (1) out << a[i] << " "; // Figure *?!?!? (2) out << *a[i] << " "; // Figure is abstract (3) out << a[i]-> save (out ); // virtual function required return out ; void test () DynArr < Figure *> arr [10]; //... ofstream out (" data. txt "); out << arr ; Circle::save записва радиус Rectangle::save записва две страни save трябва да отговаря на всички условия за сериализиране Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 12 / 23

Трето изискване: Разпознаваемост Figure *array[] Нека всички окръжности са с радиус 1, а всички правоъгълници със страни 2 array = > 6 1 1 1 2 2 2 2 1 Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 13 / 23

Трето изискване: Разпознаваемост Figure *array[] Нека всички окръжности са с радиус 1, а всички правоъгълници със страни 2 array = > 6 1 1 1 2 2 2 2 1 Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 14 / 23

Трето изискване: Разпознаваемост void circle :: save ( ostream & out ) out << " circle " << r << " "; void rectangle :: save ( ostream & out ) out << " rect " << a << " " << b << " "; array => 6 circle 1 circle 1 circle 1 rect 2 2 rect 2 2 circle 1 Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 15 / 23

Фабрика за обекти array => 6 circle 1 circle 1 circle 1 rect 2 2 rect 2 2 circle 1 istream & operator >> ( istream & in, DynArr < Figure * > a) int newsize ; in >> newsize ; DynArr < Figure * > result ( newsize ); for ( int i = 0; i < newsize ; i ++) // what is result [i ]??? result [i]-> read (in ); read! Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 16 / 23

Фабрика за обекти array => 6 circle 1 circle 1 circle 1 rect 2 2 rect 2 2 circle 1 istream & operator >> ( istream & in, DynArr < Figure * > a) int newsize ; in >> newsize ; DynArr < Figure * > result ( newsize ); for ( int i = 0; i < newsize ; i ++) result [i] = new WHAT ; // WHAT?!? result [i]-> read (in ); Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 17 / 23

Фабрика за обекти istream & operator >> ( istream & in, DynArr < Figure * > a) int newsize ; in >> newsize ; DynArr < Figure * > result ( newsize ); string type ; for ( int i = 0; i < newsize ; i ++) in >> type ; result [ i] = new type ; // unfortunately NOT!!! result [i]-> read (in ); Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 18 / 23

Фабрика за обекти istream & operator >> ( istream & in, DynArr < Figure * > a) int newsize ; in >> newsize ; DynArr < Figure * > result ( newsize ); string type ; for ( int i = 0; i < newsize ; i ++) in >> type ; result [ i] = Figure :: factory ( type ); result [i]-> read (in ); Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 19 / 23

Фабрика за обекти class Figure //... static Figure * factory ( string type ) if ( type == " circle ") return new Circle (0); if ( type == " rect ") return new Rectangle (0,0); assert ( false ); return NULL ; ; Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 20 / 23

Фабрика за обекти class Figure //... virtual void read ( istream & in) = 0; static Figure * factory ( string type ) if ( type == " circle ") return new Circle (0); if ( type == " rect ") return new Rectangle (0,0); assert ( false ); return NULL ; ; void Circle :: read ( istream & in) in >> r; void Rectangle :: read ( istream & in) in >> a >> b; Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 21 / 23

Фабрика за обекти array => 6 circle 1 circle 1 circle 1 rect 2 2 rect 2 2 circle 1 istream & operator >> ( istream &in, DynArr <Figure *> a) int newsize ; in >> newsize ; DynArr <Figure *> result ( newsize ); string type ; for ( int i = 0; i < newsize ; i ++) in >> type ; result [i] = Figure :: factory (type ); result [i]-> read (in ); class Figure //... virtual void read ( istream &in) = 0; static Figure * factory ( string type ) if (type == " circle ") return new Circle (0); if ( type == " rect ") return new Rectangle (0,0); assert ( false ); return NULL ; ; void Circle :: read ( istream &in) in >> r; void Rectangle :: read ( istream &in) in >> a >> b; Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 22 / 23

Благодаря ви за вниманието! Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 23 / 23