Завершите класс Ptr_to_T из параграфа 11.11 в виде шаблона, который использует исключения для сигнализации об ошибках времени выполнения.
Что ж друзья разобрал я этот шаблон сделал и проверил для типов string
Вот код самой программы файл Ptr_to_T.h:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//ob69vlenie klacca Ptr_to_t #ifndef PTR_TO_T_H #define PTR_TO_T_H template<class T> class Ptr_to_T { T* p;//ykazatel6 na tekychii element T* array;//ykazatel6 na macciv int size;//razmer macciva public: class Run_time_error {}; //konctryktor preobrazovani9 Ptr_to_T(T*p, T* v, int s);//priv9zka k maccivy v razmera s; nach. znachenie p //xz zachem on nyjen Ptr_to_T(T* a);//priv9zka k ob6ekty; nachal6noe znachenie p //деструктор ~Ptr_to_T();//удаление ресурсов Ptr_to_T& operator++();//prefikcnui Ptr_to_T operator++(int);//poctfikcnui Ptr_to_T& operator--();//prefikcnui Ptr_to_T operator--(int);//poctfikcnui //razumenovanie T& operator* ();//prefikcna9 operaci9 }; #endif |
Файл Ptr_to_T.cpp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
//opredelenie Ptr_to_T #include "Ptr_to_T.h" //konctryktor preobrazovani9 template<class T> Ptr_to_T<T>::Ptr_to_T(T*p, T* v, int s)//priv9zka k maccivy v razmera s; nach. znachenie p :p(p),array(v),size(s){} //konctrykotr preobrazovani9 xz zachem on nyjen template<class T> Ptr_to_T<T>::Ptr_to_T(T* a)//priv9zka k ob6ekty; nachal6noe znachenie p :p(a){} //деструктор template<class T> Ptr_to_T<T>::~Ptr_to_T()//удаление ресурсов { } template<class T> Ptr_to_T<T>& Ptr_to_T<T>::operator++()//prefikcnui { ++p; return *this; } template<class T> Ptr_to_T<T> Ptr_to_T<T>::operator++(int)//poctfikcnui { return p++; } template<class T> Ptr_to_T<T>& Ptr_to_T<T>::operator--()//prefikcnui { p--; return *this; } template<class T> Ptr_to_T<T> Ptr_to_T<T>::operator--(int)//poctfikcnui { cout <<*p<<endl; Ptr_to_T b(p--,array,size); cout <<*p<<endl; return b; } //razumenovanie template<class T> T& Ptr_to_T<T>::operator* ()//prefikcna9 operaci9 { int flag=0; for(int i=0;i<size;i++) { if(&array[i]==p) { flag=1; } } if(flag==0) throw Run_time_error(); return *p; } |
и файл main.cpp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
//klacc Ptr_to_T v vide wablona #include <iostream> using std::cout; using std::endl; #include <cstdlib> using std::exit; #include <string> using std::string; #include "Ptr_to_T.cpp" void f3(int a) { int v[200]={0}; Ptr_to_T<int> p(&v[0],v,200); p.operator--(0); p.operator*()=a;//owibka vremeni vupolneni9 (run-time error): p vne diapazona //exit(1); p.operator++(); p.operator*()=a;//ok cout <<"end"<<endl; } int main() { /*int v[200]; for(int i=0;i<200;i++) v[i]=i;*/ string v[4]; v[0]="Hellow"; v[1]="world"; v[2]="gacpada"; v[3]="dadada"; Ptr_to_T<string> p(&v[0],v,4);//inicializaci9 ykazatel9 p cout <<*p<<endl; p++; cout <<*p<<endl; /*p++; cout <<*p<<' '<<*p<<endl; ++p; cout <<"*p= "<<*p<<" *(++p)= "<<*(++p)<<endl; //f3(5);*/ return 0; } |
И все. Работает как для int так и для string. Исключения также генерируется, но не обрабатывается, просто нужно создать try блок и обработчик для данного типа исключений, в данном случае у нас тип исключений Run_time_error .
[youtube]http://www.youtube.com/watch?v=QvRhanJ4wlw[/youtube]