wiki:plans_for_lect1
1.  Проблема
class MyArrayInt {
private:
    int *array;
    size_t size;
};

class MyArrayDouble {
    double *array;
    size_t size;
};

2. Решение на C

MyArray.h
---------
#define  DefineArray(TYPE) class MyArray_ ## TYPE{\
private:\
    TYPE *array;\
    size_t size;\
};

main.c
------

#include "MyArray.h"

DefineArray(int);
DefineArray(double);

int main() {
    MyArray_int a;
    MyArray_double b;
}

- Препроцессор может заменить не то (int TYPE)
- Трудности при отладке (в редакторе один код, у компилятора другой)

3. Решение на C++

MyArray.h
---------

template <typename T>
class MyArray {
private:
    T *array;
    size_t size;

public:
    MyArray(size_t sz) {
        size = sz;
        array = new T [sz];
    }

    MyArray() {
        size = 100;
        array = new T [sz];
    }

};

template <typename T>
T MyArray<T>::get(size_t index) {
    return array[index]
}

main.cpp
--------

int main() {
    MyArray<int> a(10);
    MyArray<double> b(20);

    MyArray<MyArray<int>> c(10); //массив массивов
}

- Шаблонный класс всегда находится в загловочном файле
- Без указания параметра шаблона шаблонный класс невозможно скомпилировать
- Длинное имя типа можно укоротить: typedef Matrix MyArray<MyArray<int>>;

4. Несколько параметров шаблона

template <class K, class V> //class синоним typename
struct Node {
    K key;
    V value;
};

5. Шаблонная функция

template <typename T>
void swap(T &a, T &b) {
    T t(a);
    a = b;
    b = t;
}

int main() {
    int a = 4;
    int b = 5;

    swap<int>(a, b);
    swap(b, a); //компилятор может вывести (deduce) типы сам по входным параметрам

}

6. Структуры данных в стиле ООП

class Object {
    virtual int compare(const Object *o) = 0 const;
...
};

class SortedVector {
private:
    Object **array;
    size_t size;
    size_t capacity;
public:
    void push_back(Object *o) {

    }

    Object* get(size_t index) {

    }
};

class Dog : public  Object {
        virtual int compare(const Object &o) const {

        }
};

int main() {
    SotrtedVector v;
    v.push_back(new Dog("sharik"));
    v.push_back(new Dog("bobik"));

    Dog* d = (Dog*)v.get(0);
    d->gaf();
}

- Возможная ошибка v.push_back(new Dog()); v.push_back(new Cat());
- Для примитивных типов int, double нужны обертки Integer, Double

7. Структуры данных в стиле обобщенного (generic) программирования

template <typename T>
class vector  {
private:
    T* array;

};

class Dog {
    bool operator<(const Dog &d) const {

    }
};

int main() {
    SortedVector<Dog> v;
}
Last modified 8 years ago Last modified on 02/29/16 21:46:35