Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lect17

.pdf
Скачиваний:
7
Добавлен:
06.02.2016
Размер:
532 Кб
Скачать
☆

Исправленнаяреализация

class Color {…};

 

class IShape {

 

public:

 

virtual Color GetColor()const=0

 

virtual void SetColor(Color const& c)=0;

 

virtual double GetArea()const=0;

 

};

 

class IRectangle : public IShape {

 

…

 

};

 

class ICircle : public IShape{

 

…

 

};

11

Исправленнаяреализация

template <class Base>

class ShapeImpl : public Base { public:

…

virtual Color GetColor()const { return m_color;

}

virtual Color SetColor(Color const& c) { m_color = c;

}

private:

Color m_color; };

12

Исправленнаяреализация

class Rectangle: public ShapeImpl<IRectangle> { public:

virtual GetArea()const {

} return m_width * m_height;

private:

double m_width, m_height; };

class Circle: public ShapeImpl<ICircle> { public:

virtual GetArea()const {

} return PI * m_radius * m_radius;

private:

double m_radius; };

13

Шаблонныйумныйуказатель

Основнаяидеяумногоуказателя– управлениеподчиненнымобъектом.

Недостатокреализацииспомощью обычногокласса– дляобъектов разныхтиповприходитсясоздавать отдельныеумныеуказатели.

Выход– реализациясприменением шаблонов.

14

Шаблонныйумныйуказатель

template<class T> class SmartPtr { public:

typedef T element_type;

explicit SmartPtr(T *pVal = 0) { if(pVal)

elsem_AutoPtr = pVal;

m_AutoPtr = NULL;

}

~SmartPtr() { if(m_AutoPtr){

} } delete m_AutoPtr;

T& operator*() const { } return *m_AutoPtr;

15

Шаблонныйумныйуказатель

T*operator->() const {

}return m_AutoPtr;

T*get() const {

}return m_AutoPtr;

private:

T *m_AutoPtr;

SmartPtr<T>& operator=(SmartPtr<T>& ptrCopy); };SmartPtr(const SmartPtr<T>& ptrCopy);

16

Преимуществоиспользования обобщенногопрограммирования

Повторноеиспользованиекода

Меньшеручнойработы

Обобщенныеконтейнерыиалгоритмы

Умныеуказатели

Возможностьиспользования шаблонныхреализацийинтерфейсов припостроениииерархий наследования

17

Недостаткииспользования обобщенногопрограммирования

"Раздувание"бинарногокода

◦Прииспользованиишаблонныхфункцийи классовкомпиляторгенерируеткоднаэтапе компиляциидлявсехиспользованныхсданным шаблономтиповданных

Увеличениевременикомпиляции

Невсераспространенныекомпиляторы поддерживаютшаблонывполноймере

Код, содержащийшаблоны,сложнее анализировать

Сложностьанализасообщенийкомпилятора обошибкахкомпиляции

18

Итераторы

Итератор– этооперацияклассаколлекции,котораяпозволяет выполнятьобходэлементовтольков определеннойпоследовательности.

Итераторы,какправило,реализуются ввидеотдельныхклассов.

Дляперемещенияпоэлементам итераторреализуюткакфункторили переопределяютдругиеоперации (чаще++и-- дляперемещениявперёд иназад)

19

Примеритераторадля ассоциативногомассива

class assoc_iterator;

class assoc { public:

struct pair { char* name; int val;

};

private: pair* vec;

int max, free, maxVal; assoc(const assoc&);

assoc& operator=(const assoc&); public:

assoc(int);

int& operator[](const char*); void print_all();

friend class assoc_iterator; };

20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]