Спроектируйте и реализуйте дескрипторный класс, предоставляющий прокси-интерфейс к контейнеру. Его реализация должна базироваться на указателе на контейнер плюс реализация контейнерных операций с проверкой диапазона.
Ну я так и не понял что тут надо было сделать наверно класс обертку, просто внутри класса находится указатель на контейнер и просто перегружены все операции которые возможны для всех контейнеров, ну я не знаю я просто сделал для вектора, да и вообще я сделал кое как не охота парится долго. Я немножко операций перегрузил, а что касается проверки диапазона, то я тут не сильно понял что имеется в веду, у нас же ведь не указатель? У нас же просто обертка что ли получается.
Ладно не хочу сильно заморачиваться над этой задачей, а сразу вам предоставлю код того что у меня получилось, да там правда не на что смотреть.
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 |
//deckriptornui klacc dl9 konteinera #include <iostream> using std::cout; using std::endl; #include <vector> using std::vector; template<class Cont,class s=Cont::size_type,class v=Cont::value_type, class i=Cont::iterator> class desk { Cont* c; public: typedef i iterator; typedef s size_type; typedef v value_type; desk():c(0){} desk(Cont& s):c(&s){} desk(const desk& x):c(x.c){} //realizaci9 konteinernux operacii size_type size(){return c->size();} value_type operator[](int i){return c->operator[](i);} void push_back(const value_type& a){c->push_back(a);} void pop_back(){c->pop_back();} void clear(){c->clear();} }; int main() { cout <<"deckriptornui klacc dl9 konteinera"<<endl; int mass[]={1,2,3,4}; vector<int> v(mass,mass+4); desk<vector<int> > d(v); cout <<"d.size()= "<<d.size()<<endl; cout <<"d[1]= "<<d[1]<<endl; d.push_back(5); cout <<"d[4]= "<<d[4]<<endl; d.pop_back(); cout <<"d.size()= "<<d.size()<<endl; d.clear(); cout <<"d.size()= "<<d.size()<<endl; return 0; } |
Я еще раз повторюсь неохота мне делать для всех операций, потому что это очень трудозатратная задача. Главное это принцип теоретический. В данном примере проверка диапазона я как то не догнал что это такое.
А наверно понял тут нужно наверно когда мы перегружаем контейнер который принимает итератор, то что бы он его проверял. Щас попытаюсь перегрузить функцию insert() и попытаюсь передать в нее итератор действительный, а затем не действительный.
Все перезагрузил, вроде даже что то получилось.
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
//deckriptornui klacc dl9 konteinera #include <iostream> using std::cout; using std::endl; #include <vector> using std::vector; #include <cstdlib> using std::exit; struct out_of_bound{}; template<class Cont,class s=Cont::size_type,class v=Cont::value_type, class i=Cont::iterator> class desk { Cont* c; public: typedef i iterator; typedef s size_type; typedef v value_type; desk():c(0){} desk(Cont& s):c(&s){} desk(const desk& x):c(x.c){} //realizaci9 konteinernux operacii size_type size(){return c->size();} value_type operator[](int i){return c->operator[](i);} void push_back(const value_type& a){c->push_back(a);} void pop_back(){c->pop_back();} void clear(){c->clear();} void resize(size_type a){c->resize(a);} iterator insert(iterator it,value_type v) { valid(it); cout <<"mu tyt"<<endl; return c->insert(it,v); } iterator begin(){return c->begin();} iterator end(){return c->end();} iterator operator++(){return c->operator++();} iterator operator++(int){return c->operator++(int);} private: void valid(iterator it) { for(iterator it1=c->begin();it1!=c->end();++it1) { //cout <<"*it= "<<*it<<" *it1= "<<*it1<<endl; if(it==it1) { cout <<"*it= "<<*it<<" *it1= "<<*it1<<endl; return; } } throw out_of_bound(); } }; int main() { cout <<"deckriptornui klacc dl9 konteinera"<<endl; int mass[]={1,2,3,4}; vector<int> v(mass,mass+4); vector<int>::iterator it; desk<vector<int> > d(v); cout <<"d.size()= "<<d.size()<<endl; cout <<"d[1]= "<<d[1]<<endl; d.push_back(5); cout <<"d[4]= "<<d[4]<<endl; d.pop_back(); cout <<"d.size()= "<<d.size()<<endl; //d.clear(); cout <<"d.size()= "<<d.size()<<endl; try { //проверка диапазона it=d.begin(); it=d.insert(it,10); it=d.end(); it--; cout <<"*it= "<<*it<<endl; for(vector<int>::iterator it1=d.begin();it1!=d.end();++it1) cout <<*it1<<' '; cout <<endl; cout <<"d.size()= "<<d.size()<<endl; //делаем недействительный указатель it=d.end(); it--; cout <<"*it= "<<*it<<endl<<endl; d.resize(100); it=d.insert(it,75);//недействительный указатель /* for(vector<int>::iterator it1=d.begin();it1!=d.end();++it1) cout <<*it1<<' '; cout <<endl;*/ } catch(out_of_bound) { cout <<"except be event"<<endl; } return 0; } |
[youtube]http://www.youtube.com/watch?v=kp7JPgZUlDM[/youtube]