Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
little_girl
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 13
10.12.2013, 13:56     Шаблоны классов, перегрузка операторов #1
Задание:Реализовать шаблон классов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2013, 13:56     Шаблоны классов, перегрузка операторов
Посмотрите здесь:

Перегрузка операторов для классов C++
Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов C++
перегрузка операторов и шаблоны C++
C++ Шаблоны классов, перегрузка operator<< класса ostream
C++ Определение класса, описывающего комплексное число. Перегрузка для него бинарного оператора "*"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OrkVasya
о_____О
 Аватар для OrkVasya
209 / 209 / 31
Регистрация: 19.11.2010
Сообщений: 1,015
Завершенные тесты: 1
10.12.2013, 13:59     Шаблоны классов, перегрузка операторов #2
Перед
C++
1
2
 catch(out_of_range& ex){
    cerr << "out_of_range: " << ex.what();
блок try закрыть не забыли случаем?
KATbIK
 Аватар для KATbIK
86 / 81 / 10
Регистрация: 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 строчке.
little_girl
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;
    }
jurok_85
226 / 209 / 70
Регистрация: 21.02.2013
Сообщений: 494
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;
}
Yandex
Объявления
10.12.2013, 17:18     Шаблоны классов, перегрузка операторов
Ответ Создать тему
Опции темы

Текущее время: 16:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru