Доброго времени суток, уважаемые форумчане
Мне по лабам задали задание - реализовать шаблон контейнера (множество) с операциями доступа по индексу [], получения длины () и разности множеств "-". Вот с последним и проблемка. Опыта у меня маловато, поэтому не могу понять, то ли лыжи не едут, то ли я дурак

Меня интересует можно ли как-то реализовать перегрузку минуса, чтобы он возвращал ссылку на объект (или объект).
Код класса:
C++ |
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
| #include <iostream>
using namespace std;
template <class T>
class Set
{
int size;
T* data;
public:
Set(); //Конструктор пустого множества
Set(int n,T a); //Конструктор с параметром
Set(const Set<T>& s); //Копирования
~Set(); //Деструктор
Set<T>& operator =(const Set<T>& a); //Присваивания
T& operator [](int index); //Доступ по индексу
int operator ()(); //Возврат длины
Set<T> operator -(const Set<T>& a); //Разность множеств (Не реализовано)
void GetD(const Set<T>& a,const Set<T>& b); //Замена предыдущего
void Add(T a); //Добавляет элемент
friend ostream& operator << <>(ostream& out, const Set<T>& a);
friend istream& operator >> <>(istream& in, Set<T>& a);
};
template <class T>
Set<T>::Set()
{
size=0;
data=0;
}
template <class T>
Set<T>::Set(int n,T a)
{
size=n;
data=new T[size];
for(int i=0;i<size;i++)
data[i]=a;
}
template <class T>
Set<T>::Set(const Set<T>& a)
{
size=a.size;
data=new T[size];
for(int i=0;i<size;i++)
data[i]=a.data[i];
}
template <class T>
Set<T>::~Set()
{
delete[] data;
data=0;
}
template <class T>
Set<T>& Set<T>::operator=(const Set<T>& a) //Оператор присваивания
{
if(this==&a) return *this;
size=a.size;
if(data!=0) delete[] data;
data=new T[size];
for(int i=0;i<size;i++)
data[i]=a.data[i];
return *this;
}
template <class T>
T& Set<T>::operator[](int index) //операция доступа по индексу
{
if (index<size) return data[index];
else cout<<"\nError! Index>size";
}
template <class T>
int Set<T>::operator ()() //операция для получения длины вектора
{
return size;
}
template <class T>
void Set<T>::Add(T a)
{
T* newdata=new T[size+1];
for(int i=0;i<size;i++)
newdata[i]=data[i];
newdata[size]=a;
size=size+1;
delete[] data;
data=newdata;
}
template<class T>
Set<T> Set<T>::operator -(const Set<T>& a)
{
Set<T> temp(); //Вот здесь компилятор не может "опознать" класс
for(int i=0;i<size;i++)
for(int j=0;j<a.size;j++)
{
if(data[i]!=a.data[j])
temp.Add(data[i]); //И здесь требует, чтобы выражение слева от точки было классом
}
return temp;
}
*/
/* В связи с невозможностью выполнения предыдущей задачи
произведена замена оператора на функцию.
*/
template <class T>
void Set<T>::GetD(const Set<T> &a, const Set<T> &b)
{
T* dummy; //Указатель на объект класса
dummy=0;
if(data!=0) return; //Кидать только в пустой
for(int i=0;i<a.size;i++) //Проверим все элементы множества А
for(int j=0;j<b.size;j++) //На наличие таких же в множестве В
{
if(a.data[i]!=b.data[j]&&dummy!=a.data+i*sizeof(T)) //И выберем только те, которых нет в В
{
this->Add(a.data[i]); //Добавим их в множество С(результат)
dummy=a.data+i*sizeof(T); //И пометим адрес, чтобы не создавать дубликатов
}
}
}
template <class T>
ostream& operator <<(ostream& out,const Set<T>& a) //Вывод
{
if(a.data==0)
{
out<<"Empty Set"<<endl;
return out;
}
for(int i=0;i<a.size;i++)
out<<a.data[i]<<" ";
return out;
}
template <class T>
istream& operator >>(istream& in,Set <T>& a)
{
int n;
T t;
cout<<"N-? ";cin>>n;
for(int i=0;i<n;++i)
{
in>>t;
a.Add(t);
}
return in;
} |
|