Changes between Initial Version and Version 1 of plans_for_lect1


Ignore:
Timestamp:
02/29/16 21:46:35 (8 years ago)
Author:
Evgeny Linsky
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • plans_for_lect1

    v1 v1  
     1{{{
     21.  Проблема
     3class MyArrayInt {
     4private:
     5    int *array;
     6    size_t size;
     7};
     8
     9class MyArrayDouble {
     10    double *array;
     11    size_t size;
     12};
     13
     142. Решение на C
     15
     16MyArray.h
     17---------
     18#define  DefineArray(TYPE) class MyArray_ ## TYPE{\
     19private:\
     20    TYPE *array;\
     21    size_t size;\
     22};
     23
     24main.c
     25------
     26
     27#include "MyArray.h"
     28
     29DefineArray(int);
     30DefineArray(double);
     31
     32int main() {
     33    MyArray_int a;
     34    MyArray_double b;
     35}
     36
     37- Препроцессор может заменить не то (int TYPE)
     38- Трудности при отладке (в редакторе один код, у компилятора другой)
     39
     403. Решение на C++
     41
     42MyArray.h
     43---------
     44
     45template <typename T>
     46class MyArray {
     47private:
     48    T *array;
     49    size_t size;
     50
     51public:
     52    MyArray(size_t sz) {
     53        size = sz;
     54        array = new T [sz];
     55    }
     56
     57    MyArray() {
     58        size = 100;
     59        array = new T [sz];
     60    }
     61
     62};
     63
     64template <typename T>
     65T MyArray<T>::get(size_t index) {
     66    return array[index]
     67}
     68
     69main.cpp
     70--------
     71
     72int main() {
     73    MyArray<int> a(10);
     74    MyArray<double> b(20);
     75
     76    MyArray<MyArray<int>> c(10); //массив массивов
     77}
     78
     79- Шаблонный класс всегда находится в загловочном файле
     80- Без указания параметра шаблона шаблонный класс невозможно скомпилировать
     81- Длинное имя типа можно укоротить: typedef Matrix MyArray<MyArray<int>>;
     82
     834. Несколько параметров шаблона
     84
     85template <class K, class V> //class синоним typename
     86struct Node {
     87    K key;
     88    V value;
     89};
     90
     915. Шаблонная функция
     92
     93template <typename T>
     94void swap(T &a, T &b) {
     95    T t(a);
     96    a = b;
     97    b = t;
     98}
     99
     100int main() {
     101    int a = 4;
     102    int b = 5;
     103
     104    swap<int>(a, b);
     105    swap(b, a); //компилятор может вывести (deduce) типы сам по входным параметрам
     106
     107}
     108
     1096. Структуры данных в стиле ООП
     110
     111class Object {
     112    virtual int compare(const Object *o) = 0 const;
     113...
     114};
     115
     116class SortedVector {
     117private:
     118    Object **array;
     119    size_t size;
     120    size_t capacity;
     121public:
     122    void push_back(Object *o) {
     123
     124    }
     125
     126    Object* get(size_t index) {
     127
     128    }
     129};
     130
     131class Dog : public  Object {
     132        virtual int compare(const Object &o) const {
     133
     134        }
     135};
     136
     137int main() {
     138    SotrtedVector v;
     139    v.push_back(new Dog("sharik"));
     140    v.push_back(new Dog("bobik"));
     141
     142    Dog* d = (Dog*)v.get(0);
     143    d->gaf();
     144}
     145
     146- Возможная ошибка v.push_back(new Dog()); v.push_back(new Cat());
     147- Для примитивных типов int, double нужны обертки Integer, Double
     148
     1497. Структуры данных в стиле обобщенного (generic) программирования
     150
     151template <typename T>
     152class vector  {
     153private:
     154    T* array;
     155
     156};
     157
     158class Dog {
     159    bool operator<(const Dog &d) const {
     160
     161    }
     162};
     163
     164int main() {
     165    SortedVector<Dog> v;
     166}
     167}}}