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/18/16 21:45:19