Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/35: Рейтинг темы: голосов - 35, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 13
1

Шаблоны классов, перегрузка операторов

10.12.2013, 13:56. Показов 6343. Ответов 4
Метки нет (Все метки)

Задание:Реализовать шаблон классов Array. Перегрузить операторы присваивания =, ввода >> и вывода << (предусмотреть обработку ошибок ввода/вывода!), равенства ==, != и - при необходимости - другие операторы. Разработать тестовую программу для проверки работоспособности класса (типы данных: int, float, double, char).

Шаблон дополнить обработкой следующих исключительных ситуаций:

Выход за пределы массива при доступе к его элементам.
В конструкторах – при попытке создать массива размером более 1000000.
В операторе присваивания – при попытке присвоить один объект другому, если их размеры различаются.
Обработать ошибки при выделении памяти.

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

Программа есть, но выдает ошибки, в чем дело не понимаю.
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#include <iostream>
#include <algorithm>    // std::set_intersection, std::sort
#include <vector> 
#include <fstream>
#include <string>
#include <cstdlib>
#include <exception>
 
#include <stdexcept>
#include <new>
 
using namespace std;
 
template <class T>
class Array
{
     private:
     int _size; 
     int *pia; 
 
     public: 
     Array<T>(int sz = 12); 
     Array<T>(const Array <T> &rhs);  
     Array<T>(int *array, int sz); 
     int size(); 
     int min(); 
     int max();
     int chet ();
     bool operator== (const Array <T> &rhs); 
     bool operator!= (const Array <T> &rhs); 
     int& operator[] (int index); 
     Array <T>& operator = (const Array <T> &rhs);
     void show();
};
 
 
template <class T>
Array<T>::Array (int sz) {
    _size = sz;
    pia = new int[_size];
    for (int i=0; i<_size; i++) {
    pia[i]=0;
     }
}
                           
template<class T>
                           
Array<T>::Array (const Array <T> &rhs) {
     _size = rhs._size;
     pia = new int[_size];
     for (int i=0; i<_size; i++) {
     pia[i] = rhs.pia[i];
         }
     }
template<class T>
Array<T>::Array (int *array, int sz) {
    _size = sz;
    pia = new int[_size];
    for (int i=0; i<_size; i++) {
    pia[i] = array[i];
        }
    }
template<class T>
int Array<T>::size() {
    return _size;
    }
template<class T>
int Array<T>::min() {
    int temp = pia[0];
    for (int i=0; i<_size; i++) {
    if (pia[i]<temp) temp = pia[i];
        }
    return temp;
    }
template<class T>
int Array<T>::max() {
    int temp = pia[0];
    for (int i=0; i<_size; i++) {
    if (pia[i]>temp) temp = pia[i];
    }
    return temp;
    }
    
    template <class T>
    int Array<T>::chet() {
    int temp = 4;
    for (int i=0; i<_size; i++) {
    if (pia[i]==temp) {
        temp++;
    }
    }
    return temp;
    }
    
template<class T>
void Array<T>::show() {
    for (int i=0; i< _size; i++) {
     cout << pia[i] << "  ";
        }
           cout << "\n";
      }
template <class T>
 
 bool Array<T>::operator== (const Array <T> &rhs) {
        if (_size != rhs._size)
        return false;
             for (int i=0; i< _size; i++) {
             if (pia[i]!= rhs.pia[i])
             return false;
            }
           return true;
            }
template<class T>
bool Array<T>:: operator!= (const Array<T> &rhs){
    if(_size!= rhs._size)
    return false;
    for(int i=0; i<_size; i++){
        if(pia[i]==rhs.pia[i])
        return true;
    }
    return false;
    }
    template<class T>
     int& Array<T>::operator[](int index)
    {
          if ((index < 0) || (index > _size)){
          throw out_of_range("out of range");
          }
          return pia[index];
      }
                  
template<class T>
Array<T>& Array<T>::operator=(const Array <T> &rhs) {
    
     if (this == &rhs) {
         return *this;
         }
     pia = rhs.pia;
     return *this;
    }
    
    template <class U>
    istream& operator >>(istream &s, const Array<U> &arr)
    {
    int i;
     s >> arr[i];
     return s;
    }   
    template <class U>
    ostream& operator <<(ostream &s, const Array<U> &arr)
    {
    int i;
    s<<arr[i];
    return s;
    }
    
    /*
    class out_of_range : public logic_error {
    public:
      explicit out_of_range (const string& ex));
      };
      */
 
int main(){
    try{
    int mas[10] = {4, 10, 3, 5, 4, 22, 4, 31111, 57, 96};
    Array<int> arr(10);
 
    Array<int> arr1(mas, 10);
    Array<int> arr2(mas, 10);
    cout << "Basic array\n";
    arr.show();
    arr[0] = 500;
    arr.show();
    
    cout << "Initialization array\n";
    arr1.show();
    cout << "Copy constructor:\n";
    Array<int> arr3(arr1);
    arr3.show();
     cout << "=\n";
     arr1 = arr;
     arr1.show();
      arr2.chet();
    cout << "Another size|min|max:\n";
    cout << arr2.size() << " | " << arr2.chet() << ;
    cout << (arr1==arr) << "\t";
    cout << (arr1!=arr) << "\n";
    //string str( "Micro" );
    //      string rstr( "soft" );
    //            str.append( rstr, 5, 3 );
    //                  cout << str << endl;
    //                         }
    //                        catch ( exception &e ) {
    //                              cerr << "Caught: " << e.what( ) << endl;
     catch(out_of_range& ex){
    cerr << "out_of_range: " << ex.what();
 
    }
    
    catch(bad_alloc& ex){
            cerr<< "bad_alloc"<<ex.what();
    
} 
return 0;
    }
а это все ошибки
./OOP.3.cpp:213:6: error: expected primary-expression before ‘catch’
./OOP.3.cpp:213:6: error: expected ‘;’ before ‘catch’
./OOP.3.cpp:218:2: error: expected primary-expression before ‘catch’
./OOP.3.cpp:218:2: error: expected ‘;’ before ‘catch’
./OOP.3.cpp:223:5: error: expected ‘catch’ at end of input
./OOP.3.cpp:223:5: error: expected ‘(’ at end of input
./OOP.3.cpp:223:5: error: expected type-specifier at end of input
./OOP.3.cpp:223:5: error: expected ‘)’ at end of input
./OOP.3.cpp:223:5: error: expected ‘{’ at end of input
./OOP.3.cpp:223:5: error: expected ‘}’ at end of input
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2013, 13:56
Ответы с готовыми решениями:

Перегрузка операторов и шаблоны
#include &lt;iostream&gt; using namespace std; template &lt;class X, int size&gt; class type { X mas;...

Шаблоны и перегрузка различных операторов
Не могу правильно описать шаблон при перегрузке операторов. Добился того,что не видит ошибок..но...

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг...

Перегрузка операторов для классов
Определить класс описывающий вектор в пространстве. Для класса перегрузить префиксный унарный...

4
о_____О
Эксперт 1С
222 / 221 / 37
Регистрация: 19.11.2010
Сообщений: 1,062
10.12.2013, 13:59 2
Перед
C++
1
2
 catch(out_of_range& ex){
    cerr << "out_of_range: " << ex.what();
блок try закрыть не забыли случаем?
1
86 / 81 / 28
Регистрация: 02.08.2011
Сообщений: 335
10.12.2013, 14:03 3
Держи
Кликните здесь для просмотра всего текста
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
#include <iostream>
#include <algorithm>    // std::set_intersection, std::sort
#include <vector>
#include <fstream>
#include <string>
#include <cstdlib>
#include <exception>
 
#include <stdexcept>
#include <new>
 
using namespace std;
 
template <class T>
class Array
{
     private:
     int _size;
     int *pia;
 
     public:
     Array<T>(int sz = 12);
     Array<T>(const Array <T> &rhs);
     Array<T>(int *array, int sz);
     int size();
     int min();
     int max();
     int chet ();
     bool operator== (const Array <T> &rhs);
     bool operator!= (const Array <T> &rhs);
     int& operator[] (int index);
     Array <T>& operator = (const Array <T> &rhs);
     void show();
};
 
 
template <class T>
Array<T>::Array (int sz) {
    _size = sz;
    pia = new int[_size];
    for (int i=0; i<_size; i++) {
    pia[i]=0;
     }
}
 
template<class T>
 
Array<T>::Array (const Array <T> &rhs) {
     _size = rhs._size;
     pia = new int[_size];
     for (int i=0; i<_size; i++) {
     pia[i] = rhs.pia[i];
         }
     }
template<class T>
Array<T>::Array (int *array, int sz) {
    _size = sz;
    pia = new int[_size];
    for (int i=0; i<_size; i++) {
    pia[i] = array[i];
        }
    }
template<class T>
int Array<T>::size() {
    return _size;
    }
template<class T>
int Array<T>::min() {
    int temp = pia[0];
    for (int i=0; i<_size; i++) {
    if (pia[i]<temp) temp = pia[i];
        }
    return temp;
    }
template<class T>
int Array<T>::max() {
    int temp = pia[0];
    for (int i=0; i<_size; i++) {
    if (pia[i]>temp) temp = pia[i];
    }
    return temp;
    }
 
    template <class T>
    int Array<T>::chet() {
    int temp = 4;
    for (int i=0; i<_size; i++) {
    if (pia[i]==temp) {
        temp++;
    }
    }
    return temp;
    }
 
template<class T>
void Array<T>::show() {
    for (int i=0; i< _size; i++) {
     cout << pia[i] << "  ";
        }
           cout << "\n";
      }
template <class T>
 
 bool Array<T>::operator== (const Array <T> &rhs) {
        if (_size != rhs._size)
        return false;
             for (int i=0; i< _size; i++) {
             if (pia[i]!= rhs.pia[i])
             return false;
            }
           return true;
            }
template<class T>
bool Array<T>:: operator!= (const Array<T> &rhs){
    if(_size!= rhs._size)
    return false;
    for(int i=0; i<_size; i++){
        if(pia[i]==rhs.pia[i])
        return true;
    }
    return false;
    }
    template<class T>
     int& Array<T>::operator[](int index)
    {
          if ((index < 0) || (index > _size)){
          throw out_of_range("out of range");
          }
          return pia[index];
      }
 
template<class T>
Array<T>& Array<T>::operator=(const Array <T> &rhs) {
 
     if (this == &rhs) {
         return *this;
         }
     pia = rhs.pia;
     return *this;
    }
 
    template <class U>
    istream& operator >>(istream &s, const Array<U> &arr)
    {
    int i;
     s >> arr[i];
     return s;
    }
    template <class U>
    ostream& operator <<(ostream &s, const Array<U> &arr)
    {
    int i;
    s<<arr[i];
    return s;
    }
 
    /*
    class out_of_range : public logic_error {
    public:
      explicit out_of_range (const string& ex));
      };
      */
 
int main(){
    try{
    int mas[10] = {4, 10, 3, 5, 4, 22, 4, 31111, 57, 96};
    Array<int> arr(10);
 
    Array<int> arr1(mas, 10);
    Array<int> arr2(mas, 10);
    cout << "Basic array\n";
    arr.show();
    arr[0] = 500;
    arr.show();
 
    cout << "Initialization array\n";
    arr1.show();
    cout << "Copy constructor:\n";
    Array<int> arr3(arr1);
    arr3.show();
     cout << "=\n";
     arr1 = arr;
     arr1.show();
      arr2.chet();
    cout << "Another size|min|max:\n";
    cout << arr2.size() << " | " << arr2.chet() << std::endl;
    cout << (arr1==arr) << "\t";
    cout << (arr1!=arr) << "\n";
    //string str( "Micro" );
    //      string rstr( "soft" );
    //            str.append( rstr, 5, 3 );
    //                  cout << str << endl;
    //                         }
    //                        catch ( exception &e ) {
    //                              cerr << "Caught: " << e.what( ) << endl;
    }
     catch(out_of_range& ex){
    cerr << "out_of_range: " << ex.what();
 
    }
 
    catch(bad_alloc& ex){
            cerr<< "bad_alloc"<<ex.what();
 
}
return 0;
    }

Как заметил орк, забыли скобку закрыть и еще ошибка в 186 строчке.
0
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 13
10.12.2013, 14:14  [ТС] 4
Спасибо большое! А вот еще вопрос, метод должен показывать сколько раз повторяется элемент. правильно ли он реализован?
C++
1
2
3
4
5
6
7
8
9
10
template <class T>
    int Array<T>::chet() {
    int temp = 4;
    for (int i=0; i<_size; i++) {
    if (pia[i]==temp) {
        temp++;
    }
    }
    return temp;
    }
0
352 / 312 / 215
Регистрация: 21.02.2013
Сообщений: 743
10.12.2013, 17:18 5
Цитата Сообщение от little_girl Посмотреть сообщение
template <class T> int Array<T>::chet() { int temp = 4; for (int i=0; i<_size; i++) { if (pia[i]==temp) { temp++; } } return temp; }
я бы так написал, где в параметрах функции передается индекс элемента который хотим проверить:
C++
1
2
3
4
5
6
7
8
9
10
template <class T>
    int Array<T>::povtor( int index) {
    int temp = 0;
    for (int i=0; i<size; i++) {
        if(pia[index] == a[i])
        temp++;
    }
 
    return temp;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2013, 17:18

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Шаблоны классов, перегрузка operator<< класса ostream
Не компилируется программа. fatal error: 1 unresolved externals Как правильно определить...

Перегрузка операторов для наследованных классов
Есть один класс, для него определена операция сложения. Есть так же наследованный класс для него...

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в...

Шаблоны классов (умножение классов)
Прошу помочь, нужно создать шаблон для умножения значений 2-х классов. Умножить классы просто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.