Lect17
.pdfИсправленнаяреализация
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