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

Lect17

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

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

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

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