Kselax.ru

Hacker Kselax — the best hacker in the world

Menu
  • Блог
  • Контакты
  • wp plugin генератор
  • Русский
    • Русский
    • English
Menu

Дескрипторный класс.

Posted on 21 Июль, 201327 Июль, 2013 by admin

Спроектируйте и реализуйте дескрипторный класс, предоставляющий прокси-интерфейс к контейнеру. Его реализация должна базироваться на указателе на контейнер плюс реализация контейнерных операций с проверкой диапазона.

Ну я так и не понял что тут надо было сделать наверно класс обертку, просто внутри класса находится указатель на контейнер и просто перегружены все операции которые возможны для всех контейнеров, ну я не знаю я просто сделал для вектора, да и вообще я сделал кое как не охота парится долго. Я немножко операций перегрузил, а что касается проверки диапазона, то я тут не сильно понял что имеется в веду, у нас же ведь не указатель? У нас же просто обертка что ли получается.

Ладно не хочу сильно заморачиваться над этой задачей, а сразу вам предоставлю код того что у меня получилось, да там правда не на что смотреть.

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]

Добавить комментарий Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Рубрики

  • C++ (293)
  • JavaScript (1)
  • linux (1)
  • MFC (39)
  • node.js (2)
  • React (3)
  • vBulletin (5)
  • Visual Studio (9)
  • wordpress (18)
  • Разное (29)

Метки

Ajax bootstrap CentOS CLI expressjs FormData GDlib google Invisible reCAPTCHA JWT media MFC php react-router-dom redux repository wordpress RTTI STL vBulletin vector Visual Studio WINAPI wordpress wp-plugins XMLHttpRequest Двоичное дерево Задачи С++ Игры С++ Исключения С++ О-большое Операторы_С++ Перегрузка операторов С++ Поиск С++ Потоки Проектирование_С++ С++ Типы_С++ Типы С++ Шаблоны С++ библиотеки локализация макросы С++ сортировка С++

Свежие комментарии

  • Samueldricy к записи Программка для заполнения форума на vBulletin 3.8.7
  • Andreybib к записи callback функции — функции обратного вызова.
  • Josephhaulp к записи Создание и использование динамических библиотек .dll в visual studio.
  • Felipesnaxy к записи Создание и использование динамических библиотек .dll в visual studio.
  • VincentKnifs к записи Создание и использование динамических библиотек .dll в visual studio.
©2019 Kselax.ru Theme by ThemeGiant