Smart-pointers: етюди на тему) (Smart-pointers: етюди на тему)


НазваSmart-pointers: етюди на тему) (Smart-pointers: етюди на тему)
Дата конвертації14.05.2013
Розмір445 b.
ТипПрезентации



(Smart-pointers: етюди на тему)

  • (Smart-pointers: етюди на тему)

  • Указники vs. маніпулятори

  • Монолітні маніпулятори

  • Гнучкі маніпулятори

  • Осібні маніпулятори

  • Закриті осібні маніпулятори

  • Вкладені маніпулятори

  • Маніпулятори масивів



Неініціалізовані указники Point *p; cout<<*p;

  • Неініціалізовані указники Point *p; cout<<*p;

  • warning C4700: local variable 'p' used without having been initialized

  • Читай warnings!



Невизначений указник Point *p = 0; if (p==0) cout<<”Undefined pointer”;

  • Невизначений указник Point *p = 0; if (p==0) cout<<”Undefined pointer”;

  • Перевіряй невизначеність



Завислий указник Time *p= new Time(0, 0, 1); Time *p1=p; delete p1; p1 = 0;

  • Завислий указник Time *p= new Time(0, 0, 1); Time *p1=p; delete p1; p1 = 0;

  • НЕ руйнуй те, що не створював



Time *p= new Time(0, 0, 1); Time *p1=p; delete p1; p1 = 0;

  • Time *p= new Time(0, 0, 1); Time *p1=p; delete p1; p1 = 0;



Неіснуючі масиви double * p = new double(1); p[0] = 2; p[1] = 3; *(p+100000) = 100;

  • Неіснуючі масиви double * p = new double(1); p[0] = 2; p[1] = 3; *(p+100000) = 100;

  • Забуті масиви double * a = new double[10000]; delete a;



Не можна переплутати з масивом Manipulator pt(new Time(0,0,1));

  • Не можна переплутати з масивом Manipulator pt(new Time(0,0,1));

  • Визначено *pt, pt->hours()

  • Не визначено pt++; pt+10; pt[100]



Розробник, а не користувач, керує видаленням delete _pointee; а не delete [] _pointee;

  • Розробник, а не користувач, керує видаленням delete _pointee; а не delete [] _pointee;



Не може бути невстановленим: ініціалізацію забезпечує конструктор

  • Не може бути невстановленим: ініціалізацію забезпечує конструктор

  • SmartPtr pTime0; vs Time * pt;



Не може зависнути, якщо в ньому правильно запрограмоване присвоєння

  • Не може зависнути, якщо в ньому правильно запрограмоване присвоєння

  • pTime2=pTime3;



Передбачає повне копіювання об’єкту маніпулювання

  • Передбачає повне копіювання об’єкту маніпулювання

  • pTime2=pTime3;



class SmartPtr { private: // Об’єкт маніпулювання Pointee *_pointee; public: // Конструктор, закритий від конвертування типів explicit SmartPtr(Pointee * p=0); // Копіювальний конструктор SmartPtr(const SmartPtr&); // Деструктор ~SmartPtr(); // Копіювальне присвоєння SmartPtr& operator=(const SmartPtr&);

  • class SmartPtr { private: // Об’єкт маніпулювання Pointee *_pointee; public: // Конструктор, закритий від конвертування типів explicit SmartPtr(Pointee * p=0); // Копіювальний конструктор SmartPtr(const SmartPtr&); // Деструктор ~SmartPtr(); // Копіювальне присвоєння SmartPtr& operator=(const SmartPtr&);



// Перевірка визначеності маніпулятора bool defined() const; // Специфічні операції над указниками // Операція розіменування маніпулятора Pointee& operator*() const; // Операція доступу за указником Pointee* operator->() const; }; // Вивід об’єкту маніпулювання ostream& operator<<(ostream &, const SmartPtr&);

  • // Перевірка визначеності маніпулятора bool defined() const; // Специфічні операції над указниками // Операція розіменування маніпулятора Pointee& operator*() const; // Операція доступу за указником Pointee* operator->() const; }; // Вивід об’єкту маніпулювання ostream& operator<<(ostream &, const SmartPtr&);



// Вивід об’єкту маніпулювання ostream& operator<<(ostream & os, const SmartPtr& sptr)

  • // Вивід об’єкту маніпулювання ostream& operator<<(ostream & os, const SmartPtr& sptr)

  • { if (sptr.defined()) os<<*sptr; #ifndef NDEGUG else os<<“Manipulator undefined”; #endif }



// Конструктор, закритий від конвертування типів SmartPtr::SmartPtr(Pointee *p): // Ініціалізація маніпулятора указником _pointee(p) { #ifndef NDEBUG cout<<"SmartPtr "<<_pointee<<" created "; cout<<*this< #endif return; }

  • // Конструктор, закритий від конвертування типів SmartPtr::SmartPtr(Pointee *p): // Ініціалізація маніпулятора указником _pointee(p) { #ifndef NDEBUG cout<<"SmartPtr "<<_pointee<<" created "; cout<<*this< #endif return; }



// Копіювальний конструктор SmartPtr::SmartPtr(const SmartPtr& source): // Спочатку невизначений указник _pointee(0) { // Якщо маніпулятор оригіналу визначений, if (source._pointee) // копіювальний конструктор об’єкту маніпулювання _pointee =new Pointee(*source._pointee); #ifndef NDEBUG cout<<"SmartPtr "<<_pointee<<" copied "; cout<<*this<#endif return; }

  • // Копіювальний конструктор SmartPtr::SmartPtr(const SmartPtr& source): // Спочатку невизначений указник _pointee(0) { // Якщо маніпулятор оригіналу визначений, if (source._pointee) // копіювальний конструктор об’єкту маніпулювання _pointee =new Pointee(*source._pointee); #ifndef NDEBUG cout<<"SmartPtr "<<_pointee<<" copied "; cout<<*this<#endif return; }



// Деструктор SmartPtr::~SmartPtr() { #ifndef NDEBUG cout<<"SmartPtr to "<<_pointee<<" deleted "; cout<<*this<#endif // Видаляється однин об’єкт, а не масив!!! delete _pointee; return; }

  • // Деструктор SmartPtr::~SmartPtr() { #ifndef NDEBUG cout<<"SmartPtr to "<<_pointee<<" deleted "; cout<<*this<#endif // Видаляється однин об’єкт, а не масив!!! delete _pointee; return; }



// Копіювальне присвоєння SmartPtr& SmartPtr::operator=(const SmartPtr& source) { if(&source!=this) { // Видалення старого значення delete _pointee; // Якщо маніпулятор оригіналу визначений, if (source._pointee) // копіювальний конструктор об’єкту маніпулювання _pointee =new Pointee(*source._pointee); else _pointee= 0; } return *this; }

  • // Копіювальне присвоєння SmartPtr& SmartPtr::operator=(const SmartPtr& source) { if(&source!=this) { // Видалення старого значення delete _pointee; // Якщо маніпулятор оригіналу визначений, if (source._pointee) // копіювальний конструктор об’єкту маніпулювання _pointee =new Pointee(*source._pointee); else _pointee= 0; } return *this; }



// Операція розіменування маніпулятора Pointee& SmartPtr::operator*() const { // Передумова: маніпулятор визначений assert(defined()); return *_pointee; }

  • // Операція розіменування маніпулятора Pointee& SmartPtr::operator*() const { // Передумова: маніпулятор визначений assert(defined()); return *_pointee; }

  • // Розіменування:лівостороннє значення *pTime2 = Time(1, 2, 3); // Розіменування: правостороннє значення cout<<*pTime2<



// Операція доступу за указником Pointee* SmartPtr::operator->() const { // Передумова: маніпулятор визначений assert(defined()); return _pointee; }

  • // Операція доступу за указником Pointee* SmartPtr::operator->() const { // Передумова: маніпулятор визначений assert(defined()); return _pointee; }

  • pTime0->hours(); pTime0->setHours(5); // Небезпечна операція pTime0.operator->()



// Об’єкт в динамічній пам’яті (Heap) Time *pt=new Time(0, 0, 1); SmartPtr pTimeDirect(pt);

  • // Об’єкт в динамічній пам’яті (Heap) Time *pt=new Time(0, 0, 1); SmartPtr pTimeDirect(pt);

  • // Небезпечна операція delete pt;



{ // Почали блок // Локальний об’єкт (Auto) Time t(0, 1, 2); SmartPtr pTimeDirect(&t); .............................................. // Але закінчити його не вдасться: // Смертельно небезпечна ситуація // під час виклику деструктора }

  • { // Почали блок // Локальний об’єкт (Auto) Time t(0, 1, 2); SmartPtr pTimeDirect(&t); .............................................. // Але закінчити його не вдасться: // Смертельно небезпечна ситуація // під час виклику деструктора }



// Позичений об’єкт (Borrowed)

  • // Позичений об’єкт (Borrowed)

  • SmartPtr pTime1(new Time(52,41,14));

  • SmartPtr pTime2(pTime1.operator->());

  • // Спільний об’єкт (Common)

  • Time * t = new Time(52,41,14)

  • SmartPtr pTime1(t);

  • SmartPtr pTime2(t);



class SmartPtr { private: // Об’єкт маніпулювання Pointee *_pointee; public: // Конструктор, закритий від конвертування типів explicit SmartPtr(Pointee * p=0); // Копіювальний конструктор SmartPtr(const SmartPtr&); // Деструктор ~SmartPtr(); // Копіювальне присвоєння SmartPtr& operator=(const SmartPtr&);

  • class SmartPtr { private: // Об’єкт маніпулювання Pointee *_pointee; public: // Конструктор, закритий від конвертування типів explicit SmartPtr(Pointee * p=0); // Копіювальний конструктор SmartPtr(const SmartPtr&); // Деструктор ~SmartPtr(); // Копіювальне присвоєння SmartPtr& operator=(const SmartPtr&);



// Перевірка визначеності маніпулятора bool defined() const; // Специфічні операції над указниками // Операція розіменування маніпулятора Pointee& operator*() const; // Операція доступу за указником Pointee* operator->() const; // Приєднання об’єкту SmartPtr& reset(Pointee &); // Від’єднання об’єкту Pointee& release(); };

  • // Перевірка визначеності маніпулятора bool defined() const; // Специфічні операції над указниками // Операція розіменування маніпулятора Pointee& operator*() const; // Операція доступу за указником Pointee* operator->() const; // Приєднання об’єкту SmartPtr& reset(Pointee &); // Від’єднання об’єкту Pointee& release(); };



// Приєднання об’єкту SmartPtr& SmartPtr::reset(Pointee & pt) { _pointee = &pt; return *this; }

  • // Приєднання об’єкту SmartPtr& SmartPtr::reset(Pointee & pt) { _pointee = &pt; return *this; }

  • // Від’єднання об’єкту Pointee& SmartPtr::release() { Pointee& _remember=*_pointee; _pointee = 0; return _remember; }



// Відновлення указника Time *pt=new Time(0, 0, 1); SmartPtr pTimeDirect1(pt); pt =0; pt = pTimeDirect1.release(); cout<
// Обробляйте і видаляйте без проблем
delete pt; pt=0;

  • // Відновлення указника Time *pt=new Time(0, 0, 1); SmartPtr pTimeDirect1(pt); pt =0; pt = pTimeDirect1.release(); cout<
    // Обробляйте і видаляйте без проблем
    delete pt; pt=0;



// Звільнення іменованого об'єкту Time t(0, 1, 2); SmartPtr pTimeDirect2(&t); pTimeDirect2.release();

  • // Звільнення іменованого об'єкту Time t(0, 1, 2); SmartPtr pTimeDirect2(&t); pTimeDirect2.release();

  • // Передача об'єкту Time * pt = new Time(0, 1, 2); SmartPtr pTimeDirect1(pt); SmartPtr pTimeDirect2(pTimeDirect1); pTimeDirect1.release();

  • Своєчасно від'єднуйте об'єкти спільного використання від маніпулятора



class SmartPtr { private: // Об’єкт маніпулювання Pointee *_pointee; public: // Конструктор, закритий від конвертування типів explicit SmartPtr(Pointee * p=0); // (Не)копіювальний конструктор SmartPtr(const SmartPtr&); // Деструктор ~SmartPtr(); // (Не)копіювальне присвоєння SmartPtr& operator=(const SmartPtr&);

  • class SmartPtr { private: // Об’єкт маніпулювання Pointee *_pointee; public: // Конструктор, закритий від конвертування типів explicit SmartPtr(Pointee * p=0); // (Не)копіювальний конструктор SmartPtr(const SmartPtr&); // Деструктор ~SmartPtr(); // (Не)копіювальне присвоєння SmartPtr& operator=(const SmartPtr&);



// Перевірка визначеності маніпулятора bool defined() const; // Специфічні операції над указниками // Операція розіменування маніпулятора Pointee& operator*() const; // Операція доступу за указником Pointee* operator->() const; // Приєднання об’єкту SmartPtr& reset(Pointee &); // Від’єднання об’єкту Pointee& release(); };

  • // Перевірка визначеності маніпулятора bool defined() const; // Специфічні операції над указниками // Операція розіменування маніпулятора Pointee& operator*() const; // Операція доступу за указником Pointee* operator->() const; // Приєднання об’єкту SmartPtr& reset(Pointee &); // Від’єднання об’єкту Pointee& release(); };



// (Не)копіювальний конструктор SmartPtr::SmartPtr(SmartPtr& source): // Ініціалізація копії маніпулятора _pointee(source._pointee) { #ifndef NDEBUG cout<<"SmartPtr "<<_pointee<<" copied and released "; cout<<*this<
  • // (Не)копіювальний конструктор SmartPtr::SmartPtr(SmartPtr& source): // Ініціалізація копії маніпулятора _pointee(source._pointee) { #ifndef NDEBUG cout<<"SmartPtr "<<_pointee<<" copied and released "; cout<<*this<



SmartPtr pTime1(new Time(45, 23, 1));

  • SmartPtr pTime1(new Time(45, 23, 1));

  • SmartPtr pTime2(pTime1);



// (Не)копіювальне присвоєння SmartPtr& SmartPtr::operator=(SmartPtr& source) { if (&source!=this) { // Видалимо старий об’єкт маніпулювання delete _pointee; // Приєднаємо новий _pointee=source._pointee; // Від’єднаємо об’єкт від оригіналу маніпулятора source._pointee=0; } return *this; }

  • // (Не)копіювальне присвоєння SmartPtr& SmartPtr::operator=(SmartPtr& source) { if (&source!=this) { // Видалимо старий об’єкт маніпулювання delete _pointee; // Приєднаємо новий _pointee=source._pointee; // Від’єднаємо об’єкт від оригіналу маніпулятора source._pointee=0; } return *this; }



SmartPtr pTime1(new Time(45, 23, 1)); SmartPtr pTime2(pTime1); SmartPtr pTime3(new Time);

  • SmartPtr pTime1(new Time(45, 23, 1)); SmartPtr pTime2(pTime1); SmartPtr pTime3(new Time);

  • pTime2=pTime3;



// Хто сказав, що передача параметра значенням // оберігає фактичний параметр від змін? // Функція нічого не робить, // лише показує прийнятий нею параметр void parameterEater(SmartPtr toBePassed) { cout<
  • // Хто сказав, що передача параметра значенням // оберігає фактичний параметр від змін? // Функція нічого не робить, // лише показує прийнятий нею параметр void parameterEater(SmartPtr toBePassed) { cout<



// Створимо осібний маніпулятор SmartPtr toBeEaten(new Time(1, 1, 1)); // Викличемо функцію parameterEater(toBeEaten); // Подивимося на фактичний параметр

  • // Створимо осібний маніпулятор SmartPtr toBeEaten(new Time(1, 1, 1)); // Викличемо функцію parameterEater(toBeEaten); // Подивимося на фактичний параметр



class SmartPtr { private: // Об’єкт маніпулювання Pointee *_pointee; // (Не)копіювальний конструктор SmartPtr(const SmartPtr&); public: // Конструктор, закритий від конвертування типів explicit SmartPtr(Pointee * p=0); // Деструктор ~SmartPtr(); // (Не)копіювальне присвоєння SmartPtr& operator=(const SmartPtr&);

  • class SmartPtr { private: // Об’єкт маніпулювання Pointee *_pointee; // (Не)копіювальний конструктор SmartPtr(const SmartPtr&); public: // Конструктор, закритий від конвертування типів explicit SmartPtr(Pointee * p=0); // Деструктор ~SmartPtr(); // (Не)копіювальне присвоєння SmartPtr& operator=(const SmartPtr&);



// Перевірка визначеності маніпулятора bool defined() const; // Специфічні операції над указниками // Операція розіменування маніпулятора Pointee& operator*() const; // Операція доступу за указником Pointee* operator->() const; // Приєднання об’єкту SmartPtr& reset(Pointee &); // Від’єднання об’єкту Pointee& release(); };

  • // Перевірка визначеності маніпулятора bool defined() const; // Специфічні операції над указниками // Операція розіменування маніпулятора Pointee& operator*() const; // Операція доступу за указником Pointee* operator->() const; // Приєднання об’єкту SmartPtr& reset(Pointee &); // Від’єднання об’єкту Pointee& release(); };



// Безпечна з точки зору руйнування параметру void parameterEater(const SmartPtr& toBePassed) { cout<<"Pased into the function: "; cout<<*toBePassed<
  • // Безпечна з точки зору руйнування параметру void parameterEater(const SmartPtr& toBePassed) { cout<<"Pased into the function: "; cout<<*toBePassed<



З цим все в порядку

  • З цим все в порядку

  • bool operator==(const SmartPtr&, const SmartPtr&); bool operator!=(const SmartPtr&, const SmartPtr&);

  • Як бути з порівнянням з нулем?

  • Time *pt=new Time(1, 2, 3); if(pt==0) cout<<”Pointer defined”; if(pt!=0) cout<<”Pointer undefined”;



Некопіювальний конструктор

  • Некопіювальний конструктор

  • Некопіювальне присвоєння

  • Передача параметрів незначенням

  • Втрачене порівняння



NestedSmartPtr ppTime(new SmartPtr(new Time(1, 2, 3)));

  • NestedSmartPtr ppTime(new SmartPtr(new Time(1, 2, 3)));

  • // Доступ до до члена класу Time через // маніпулятор другого рівня ppTime-> hours();

  • Розкривається як

  • // Доступ до об’єкту SmartPtr (через SmartPtr&) ppTime.operator->(); // Доступ до указника на Time (через Time*) ppTime.operator->()-> operator->(); // Доступ до члена класу Time ppTime.operator->()->.operator->()->hours();



// Клас маніпуляторів масивами class ArrayHandler { private: // Розмір масиву size_t _size; // Указник на масив Pointee *_pointee; // Указник за масивом Pointee *_end; // Указник поточного елемента масиву mutable Pointee *_current;

  • // Клас маніпуляторів масивами class ArrayHandler { private: // Розмір масиву size_t _size; // Указник на масив Pointee *_pointee; // Указник за масивом Pointee *_end; // Указник поточного елемента масиву mutable Pointee *_current;



public: // Обробник помилкових ситуацій class MisUse{}; // Конструктор, закритий від конвертування типів explicit ArrayHandler(size_t size=0); // Деструктор ~ArrayHandler(); // (Не)копіювальне присвоєння ArrayHandler& operator=(ArrayHandler&); // Перевірка визначеності маніпулятора bool defined() const; // Селектор розміру масиву size_t size() const {return _size;}

  • public: // Обробник помилкових ситуацій class MisUse{}; // Конструктор, закритий від конвертування типів explicit ArrayHandler(size_t size=0); // Деструктор ~ArrayHandler(); // (Не)копіювальне присвоєння ArrayHandler& operator=(ArrayHandler&); // Перевірка визначеності маніпулятора bool defined() const; // Селектор розміру масиву size_t size() const {return _size;}



// Специфічні операції над указниками // Операція розіменування маніпулятора Pointee& operator*() const; // Операція доступу за указником Pointee* operator->() const; // Почати обробку масиву void start() const {_current=_pointee;} // Перевірити вичерпання масиву bool stop() const {return _current==_end;}

  • // Специфічні операції над указниками // Операція розіменування маніпулятора Pointee& operator*() const; // Операція доступу за указником Pointee* operator->() const; // Почати обробку масиву void start() const {_current=_pointee;} // Перевірити вичерпання масиву bool stop() const {return _current==_end;}



// Операція індексування Pointee& operator[](size_t i); // Операції адресної арифметики // Збільшити указник поточного елемента масиву // на задане число ArrayHandler& operator+(size_t); // Операція префіксного інкременту ArrayHandler& operator++(); // Операція префіксного декременту ArrayHandler& operator--(); };

  • // Операція індексування Pointee& operator[](size_t i); // Операції адресної арифметики // Збільшити указник поточного елемента масиву // на задане число ArrayHandler& operator+(size_t); // Операція префіксного інкременту ArrayHandler& operator++(); // Операція префіксного декременту ArrayHandler& operator--(); };





Схожі:

Smart-pointers: етюди на тему) (Smart-pointers: етюди на тему) icon1 етап установчий: з 11. 01 по 20. 01. 2012 підготовка вчителя до роботи з комп'ютером та інтерактивними засобами навчання
Активувати програмний додаток до smart-дошки smart notebook (при відсутності інтерактивних дощок скачати з сайту smarttech com)
Smart-pointers: етюди на тему) (Smart-pointers: етюди на тему) iconМайстер клас
Музикант розучує етюди. Журналіст І письменник освоює прийоми письмового мовлення. Справжній учитель теж змішує фарби, розучує етюди,...
Smart-pointers: етюди на тему) (Smart-pointers: етюди на тему) iconПсихологічні етюди про виховання Підготувала Богдан Н. Г., практичний психолог дитячого будинку, «цзд»

Smart-pointers: етюди на тему) (Smart-pointers: етюди на тему) iconSmart meeting 30 серпня 2012р. Рівне
Завдання керівника зробити організацію ефективною в коротко і довготривалому періоді часу
Smart-pointers: етюди на тему) (Smart-pointers: етюди на тему) iconВивчивши цю тему, Ви зможете: Вивчивши цю тему, Ви зможете
Вивчивши цю тему, Ви зможете: поглибити знання, одержані в попередніх розділах, щодо механізму функціонування попиту і пропозиції...
Smart-pointers: етюди на тему) (Smart-pointers: етюди на тему) iconВивчивши цю тему, Ви зможете: Вивчивши цю тему, Ви зможете
Вивчивши цю тему, Ви зможете: пояснити сутність, поняття, призначення, походження та розвиток комерційних банків
Smart-pointers: етюди на тему) (Smart-pointers: етюди на тему) iconНа тему: На тему: “Аналіз стану та перспектив розвитку тваринництва”

Smart-pointers: етюди на тему) (Smart-pointers: етюди на тему) iconОгляд методичної літератури Доповідь на тему «Неуспішність учнів і шляхи її подолання»
Методичний семінар на тему: «Творча діяльність молодших школярів у позакласній роботі»
Smart-pointers: етюди на тему) (Smart-pointers: етюди на тему) iconПрезентацію на тему: Презентацію на тему
Розвивати вміння порівнювати українську культуру минулого та сьогодення; творчі здібності, пізнавальну активність
Smart-pointers: етюди на тему) (Smart-pointers: етюди на тему) iconНеозначена форма дієслова 3 клас Презентацію підготувала вчитель – методист
У цьому напису закодовано тему нашого уроку. Треба спочатку написати, а потім розкодувати тему уроку

Додайте кнопку на своєму сайті:
dok.znaimo.com.ua


База даних захищена авторським правом ©dok.znaimo.com.ua 2013
звернутися до адміністрації
dok.znaimo.com.ua
Головна сторінка