Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
little_girl
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 13
#1

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

10.12.2013, 13:56. Просмотров 1920. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2013, 13:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны классов, перегрузка операторов (C++):

перегрузка операторов и шаблоны - C++
#include &lt;iostream&gt; using namespace std; template &lt;class X, int size&gt; class type { X mas; public: type() { for(int i =...

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

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

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

Шаблоны классов, перегрузка operator<< класса ostream - C++
Не компилируется программа. fatal error: 1 unresolved externals Как правильно определить operator&lt;&lt; ??? #include &lt;iostream&gt; ...

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

4
OrkVasya
о_____О
Эксперт 1С
218 / 218 / 34
Регистрация: 19.11.2010
Сообщений: 1,056
Завершенные тесты: 1
10.12.2013, 13:59 #2
Перед
C++
1
2
 catch(out_of_range& ex){
    cerr << "out_of_range: " << ex.what();
блок try закрыть не забыли случаем?
1
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 строчке.
0
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;
    }
0
jurok_85
243 / 227 / 78
Регистрация: 21.02.2013
Сообщений: 521
Завершенные тесты: 1
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
10.12.2013, 17:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2013, 17:18
Привет! Вот еще темы с ответами:

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

Перегрузка и шаблоны - C++
Для каждого пункта задания создать: 1. Перегружаемые функции для типов int и double 2. Шаблоны функций Все необходимые данные для...

Перегрузка и шаблоны функций - C++
Добрый день. Приведенную нижу задачу нужно оформить в виде шаблонов функций. В одномерном массиве, состоящем из n вещественных элементов,...

Перегрузка оператора [] и шаблоны. - C++
Всем доброго времени суток! Проблема такая: есть класс сVector template &lt;class T, int Size&gt; class cVector { T *m_data; ...


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

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

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