С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/79: Рейтинг темы: голосов - 79, средняя оценка - 4.53
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
1

Шаблоны классов

08.11.2010, 17:46. Показов 14478. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Условия:
1. Создать шаблон класса для работы с массивом произвольного типа данных. Шаблон должен включать:
• указатель, хранящий адрес размещения массива в динамической памяти;
• целочисленную переменную, показывающую количество занятых элементов массива;
• конструктор без параметров с параметрами по умолчанию;
• конструктор копирования;
• метод «обработка массива» (на начальном этапе метод выводит на консоль какое-либо сообщение);
• деструктор
и другие необходимые для работы методы (например, перегрузка операций индексирования и присваивания, методы ввода / вывода и т.д.).
2. Предусмотреть генерацию и обработку исключений для возможных ошибочных ситуаций (отрицательная размерность при задании массива, выход за границы диапазона при обращении по индексу и т.д.).
3. В функции main() показать использование созданного класса, включая ситуации, приводящие к генерации исключений; показать инстанцирование шаблона для различных типов.
4. На основе данного шаблона создать

Задание:
Дана строка латинских символов. Преобразовать строку, разместив символы в алфавитном порядке, разделяя их пробелами.

Вот не совсем понимаю, как написать конструктор для массива, да еще и конструктор копирования
Может кто помочь?
Извените не там созадл тему, переместите для начинающих))

Добавлено через 2 часа 22 минуты
Вот что то попробовал, но с перегрузкой индексирования не понимаю как сделать. И еще ошибку выдает:
error C2955: List: для использования класса шаблон требуется список аргументов шаблон
error C2244: List<T>::operator []: не удается сопоставить определение функции существующему объявлению

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
#include <string.h>
#include <iostream>
using namespace std;
 
template <class T>
class List{
private:
    T* mass;
    int n;
public:
    List(T* str){
        if(str){
            mass = new T [strlen(str)];
            n = strlen(str);
            for(int i=0;i<strlen(str);i++){
                mass[i] = str[i];
            }
            
        }
        else{
            mass = 0;
            n = 0;
        }
    }
    List(List& tam){
        if(tam.mass){
            mass = new T [strlen(tam.mass)];
            n = strlen(tam.mass);
            for(int i=0;i<strlen(tam.mass);i++){
                mass[i] = tam.mass[i];
            }
            
        }
        else{
            tam.mass = 0;
            n = 0;
        }
    }
    char& operator [] (int);
    void show_list(){
        for(int i=0;i<n;i++){
            cout<<mass[i]<<" ";
        }
        cout<<endl;
    }
    ~List(){
        delete [] mass;
    }
};
 
template<class T>T& List::operator [] (int i){
    if(i <= n){
        switch(i){
        case i: return mass[i];
        }
    }
}
 
int main(){
    setlocale(LC_ALL,"Russian");
    List<char>tam("Привет");
    tam.show_list();
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2010, 17:46
Ответы с готовыми решениями:

Шаблоны классов в С++
Добрый вечер. Сам удивляюсь, что задаю этот вопрос - но что-то не хотят работать шаблоны, или я...

Шаблоны классов
Зачем нужен шаблонный класс, какой от него главный смысл?

шаблоны классов
Есть код: #include&quot;stdafx.h&quot; #include&lt;conio.h&gt; #include&lt;iostream&gt; using namespace std;...

VS 2013 - шаблоны классов -> обязательно ли функции шаблона класса делать встроенными?
Добрый день, столкнулась со следующей проблемой при работе с шаблонами классов: Имеется шаблон...

18
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
08.11.2010, 20:08 2
В принципе, довольно неплохо. Видимые ошибки:
1. Почему класс назван List - список? Массив - это скорее Array.... Имя класса дезориентирует. Нужно исправить.
2. Нет требуемого по заданию конструктора без параметров (или с параметрами по умолчанию).
3. Конструктор List(T* str) реализован с ошибкой - память нужно выделять также и для завершающего строку символа '\0'. И, конечно же, копировать и его. А что мешает использовать стандартную функцию strcpy?
4. Конструктор копирования реализован с тремя ошибками: 1. нет проверки на присваивание самому себе, 2. та же самая ошибка с завершающим нуль символом, 3. копирование производит вмешательство в данные _копируемого_ объекта. Правильная сигнатура была бы List(const List<T>& tam).

Для операции индексирования полезно реализовать две сигнатуры - T& operator [] (int) для записи, и T operator [] (int) const для чтения.

В общем, начал ты неплохо. Правь код, выкладывай исправленный вариант, и будем посмотреть дальше....
1
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
08.11.2010, 20:47  [ТС] 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
#include <string.h>
#include <iostream>
using namespace std;
 
template <class T>
class Array{
private:
    T* mass;
    int n;
public:
    Array(T* str);  //конструктор по умл
 
    Array(const Array& tam);    //конструктор копирования
 
    T& operator [] (int);   //перегрузка оператора индексирования
 
    void show_list();   //вывод на экран
 
    ~Array(){
        delete [] mass;
    }   //диструктор
 
    int sort_list();    //сортировка
 
    T& operator = (const Array& tam);   //перегрузка операции присваивания
};
 
template<class T>Array<T>::Array(T* str){
    if(str){
        mass = new T [strlen(str)+1];
        n = strlen(str)+1;
        strcpy(mass,str);
            
    }
    else{
        mass = 0;
        n = 0;
    }
}
 
template<class T>Array<T>::Array(const Array& tam){
    if(tam.mass){
        mass = new T [strlen(tam.mass)+1];
        n = strlen(tam.mass);
        strcpy(mass,tam.mass);
    }
    else{
        tam.mass = 0;
        n = 0;
    }
}
 
template<class T>void Array<T>::show_list(){
    for(int i=0;i<n;i++){
        cout<<mass[i]<<" ";
    }
    cout<<endl;
}
 
template<class T>T& Array<T>::operator [] (int i){
    if(i <= n){
        return mass[i];
    }
    else cout<<"Error"<<endl;
}
 
template<class T>int Array<T>::sort_list(){
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(mass[i] < mass[j]){
                T gh = mass[i];
                mass[i] = mass[j];
                mass[j] = gh;
            }
        }
    }
    return 0;
}
 
template<class T>T& Array<T>::operator =(const Array& tam){
    if (&tam == this) return *this;//сравнение адресов
    if (mass) delete[] mass;
    if (t.mass){
        mass = new char [strlen(t.mass)+1];
        strcpy(mass,t.stime);
    }else
        mass = 0;
    return *this;
}
 
 
int main(){
    setlocale(LC_ALL,"Russian");
    Array<char>tam("привет");
    tam.show_list();
    tam.sort_list();
    tam.show_list();
return 0;
}
Добавлено через 8 минут
На счет индексирования вообще не понимаю как делать(((
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
08.11.2010, 21:01 4
Почему же не понимаешь? Сделал его ты (или все же не ты??) правильно...
Вот теперь уже код значительно лучше! Внимательнее посмотрю завтра уже, наверняка нарою еще багов :-)
0
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
08.11.2010, 21:09  [ТС] 5
Не, ну написал его я, и это разве я правильно написал?
Т.е. можно можно написать:
C++
1
tam[0] = "а";
Я здесь спрашиваю, потому что у меня выдает ошибку:
error C2440: =: невозможно преобразовать "const char [2]" в "char"

Добавлено через 3 минуты
да этого еще другая была
0
232 / 102 / 5
Регистрация: 18.04.2010
Сообщений: 294
08.11.2010, 22:28 6
C++
1
tam[0] = 'а';
0
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
09.11.2010, 15:22  [ТС] 7
Цитата Сообщение от 6a6ka Посмотреть сообщение
C++
1
tam[0] = 'а';
да да, это я тупанул, уже нашел )))

Добавлено через 12 минут
Вот переделал программу, уже так сказать более абстрактно, для разных типов:
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
#include <string.h>
#include <iostream>
using namespace std;
 
template <class T>
class Array{
private:
    T* mass;
    int size;
public:
    Array(int n);               //конструктор по умл
    ~Array(){
        if(mass){
            delete [] mass;
        }
    }                                   //деструктор
    Array(const Array& tam);            //конструктор копирования
    T& operator = (const Array& tam);   //перегрузка операции присваивания
    T& operator [] (int);               //перегрузка оператора индексирования
    int sort_list();                    //сортировка
    void show_list();                   //вывод на экран
};
 
template<class T>Array<T>::Array(int n){
    size = n;
    if(n){
        mass = new T [size];
    }
    else{
        mass = 0;
    }
}
 
template<class T>Array<T>::Array(const Array& tam){
    size = tam.size;
    if(tam.mass){
        mass = new T [size];
        for(int i=0;i<size;i++){
            mass[i] = tam.mass[i];
        }
    }
    else{
        mass = 0;
    }
}
 
template<class T>void Array<T>::show_list(){
    for(int i=0;i<size;i++){
        cout<<mass[i]<<" ";
    }
    cout<<endl;
}
 
template<class T>T& Array<T>::operator [] (int i){
    if(i < size){
        return mass[i];
    }
    else{
        cout<<"Error"<<endl;
        exit(1);
    }
}
 
template<class T>int Array<T>::sort_list(){
    for(int i=0;i<size;i++){
        for(int j=0;j<size;j++){
            if(mass[i] < mass[j]){
                T gh = mass[i];
                mass[i] = mass[j];
                mass[j] = gh;
            }
        }
    }
    return 0;
}
 
template<class T>T& Array<T>::operator = (const Array& tam){
    if (&tam == this) return *this;//сравнение адресов
    if (mass) delete[] mass;
    size = tam.size;
    if (tam.mass){
        mass = new T [size];
        for(int i=0;i<size;i++){
            mass[i] = tam.mass[i];
        }
    }else
        mass = 0;
    return *this;
}
 
int main(){
    setlocale(LC_ALL,"Russian");
    Array<char>tam(10);
    tam[0] = 'a';
    tam.show_list();
 
    Array<int>lat(10);
    lat.show_list();
return 0;
}
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.11.2010, 04:00 8
robert19, Советую все же еще
C++
1
const T& operator [] (size_t) const;
Сделать.
И когда с индексацией работаете лучше мне кажется size_t использовать, ибо индекс никаким раком не может быть отрицательным.
И впринципе я бы сделал вместо Show_list - перегрузку оператора вывода в поток. Причем вне класса.

C++
1
2
3
4
5
6
7
8
9
10
template<class T2>
std::ostream& operator <<(std::ostream& os, const Array<T2>& Ob)
{
    for(size_t i=0; i<Ob.Size(); ++i)
    {
         os<<Ob[i];
    }
    os<<'\n';
    return os;
}
Добавлено через 8 минут
Для чего соответственно не помешал бы метод Size() или что-нибудь вроде. А переменную size неплохо бы сделать size_t.

C++
1
2
3
4
const size_t Size() const
{
    return size;
}
+ у вас нет никакой обработки исключений, хотя об этом сказано в задании. Сишная обработка - не лучшее для таких программ.
А так впринципе все довольно неплохо.

Добавлено через 2 минуты
На кой тут int аще не понятно. void будет лучше.

C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class T>int Array<T>::sort_list(){
        for(int i=0;i<size;i++){
                for(int j=0;j<size;j++){
                        if(mass[i] < mass[j]){
                                T gh = mass[i];
                                mass[i] = mass[j];
                                mass[j] = gh;
                        }
                }
        }
        return 0;
}
Ну и соответственно ввод с консоли я бы тоже посоветовал сделать перегрузкой оператора >>.
C++
1
2
3
4
5
6
7
8
9
template<class T2>
std::istream& operator >>(std::ostream& is, const Array<T2>& Ob)
{
    for(size_t i=0; i<Ob.Size(); ++i)
    {
         is>>Ob[i];
    }
    return is;
}
1
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
10.11.2010, 07:34  [ТС] 9
Ну вот я решил пока вот так написать:
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
#include <string.h>
#include <iostream>
using namespace std;
 
template <class T>
class Array{
private:
    T* mass;
    int size;
    int index;
public:
    Array(int n = 0);               //конструктор по умл
    ~Array(){
        if(mass){
            delete [] mass;
        }
    }                                   //деструктор
    Array(const Array& tam);            //конструктор копирования
    T& operator = (const Array& tam);   //перегрузка операции присваивания
    const T& operator [] (int);             //перегрузка оператора индексирования
    void add();
    void sort_list();                   //сортировка
    void show_list();                   //вывод на экран
};
 
template<class T>Array<T>::Array(int n = 0){
    size = n;
    index = 0;
    if(n){
        mass = new T [size];
    }
    else{
        mass = 0;
    }
}
 
template<class T>Array<T>::Array(const Array& tam){
    size = tam.size;
    index = 0;
    if(tam.mass){
        mass = new T [size];
        for(int i=0;i<size;i++){
            mass[i] = tam.mass[i];
        }
    }
    else{
        mass = 0;
    }
}
 
template<class T>void Array<T>::show_list(){
    for(int i=0;i<index;i++){
        cout<<mass[i]<<" ";
    }
    cout<<endl;
    //cout<<"Количество занятых ячеек массива: "<<index<<endl;
}
 
template<class T>const T& Array<T>::operator [] (int i){
    if(i < size){
        return mass[i];
    }
    else{
        cout<<"Error"<<endl;
        exit(1);
    }
}
 
template<class T>void Array<T>::sort_list(){
    for(int i=0;i<size;i++){
        for(int j=0;j<size;j++){
            if(mass[i] < mass[j]){
                T gh = mass[i];
                mass[i] = mass[j];
                mass[j] = gh;
            }
        }
    }
}
 
template<class T>T& Array<T>::operator = (const Array& tam){
    if (&tam == this) return *this;//сравнение адресов
    if (mass) delete[] mass;
    size = tam.size;
    if (tam.mass){
        mass = new T [size];
        for(int i=0;i<size;i++){
            mass[i] = tam.mass[i];
        }
    }else
        mass = 0;
    return *this;
}
 
template<class T>void Array<T>::add(){
    T tamp;
    for(int i=0;i<3;i++){
        cout<<"Введите значение: ";
        cin>>tamp;
        if(((tamp > 'А')&&(tamp < 'я'))||((tamp > 'a')&&(tamp < 'z'))||((tamp > 0)&&(tamp < 9))){
            mass[i] = tamp;
            ++index;
        }
        else{
            throw 1;
        }
    }
    //system("cls");
}
 
int main(){
    setlocale(LC_ALL,"Russian");
    Array<char>tam(5);
    while(true){
        try{
            tam.add();
            break;
        }
        catch(int n){
            system("cls");
            cout<<"\nОшибка - "<<n<<endl;
            continue;
        }
    }
    cout<<"\n";
 
    Array<int>lat(2);
    while(true){
        try{
            lat.add();
            break;
        }
        catch(int n){
            system("cls");
            cout<<"\nОшибка - "<<n<<endl;
            continue;
        }
    }
    cout<<"\n";
    
    Array<float>rot(2);
    while(true){
        try{
            rot.add();
            break;
        }
        catch(int n){
            system("cls");
            cout<<"\nОшибка - "<<n<<endl;
            continue;
        }
    }
    cout<<"\n";
    tam.show_list();
    lat.show_list();
    rot.show_list();
    
return 0;
}
Добавлено через 1 минуту
И вот вы мне выше писали про перегрузку через потоки. Я просто еще не учил((
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
10.11.2010, 10:26 10
Цитата Сообщение от robert19 Посмотреть сообщение
C++
1
template<class T> const T& Array::operator [] (int i) ...
Стоп! вот здесь ты накосячил. Если будет возвращена ссылка на константный элемент массива (const T&), то ты не сможешь изменять этот элемент - это ведь не то, чего ты хотел бы добиться, не так ли?
Правильно сделать две версии оператора [] - константную и неконстантную. Константная для чтения, неконстантная для записи - а компилятор уж сам разберется, когда какую вызвать. Сигнатуры такие:
C++
1
2
template<class T> T& Array::operator [] (int i);  // неконстантная версия
template<class T> const T& Array::operator[] (int i) const;  // константная версия
0
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
10.11.2010, 11:06  [ТС] 11
А зачем 2 версии, что то понять не могу. Ну записал я туда какое нить значение и все же.
и вот еще интересно, когда создаю объект флоат и ввожу туда значения пример: 1,2 2,5. Он их показывает как целые 1 и 2. как это исправить?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
10.11.2010, 11:24 12
1. Ну если лень писать, то можешь оставить одну - неконстантную. Но грамотно все-таки две. Я уже объяснил, почему.
2. вводить надо 1.2 и 2.5
0
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
10.11.2010, 11:44  [ТС] 13
Да мне не лень. просто на лекциях когда показывали, приводили только 1 пример.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
10.11.2010, 12:05 14
Мдя. Если преп о константности не в курсах, то что уж тут говорить :-( .....
0
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
10.11.2010, 15:25  [ТС] 15
Цитата Сообщение от CheshireCat Посмотреть сообщение
Мдя. Если преп о константности не в курсах, то что уж тут говорить :-( .....
Может просто я не внимательно слушал)))
0
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
12.11.2010, 23:56  [ТС] 16
Ну вот вроде все выполнил:
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
#include <string.h>
#include <iostream>
using namespace std;
 
template <class T>
class Array{
private:
    T* mass;
    int size;
    int index;
public:
    Array(int n = 0);               //конструктор по умл
    ~Array(){
        if(mass){
            delete [] mass;
        }
    }                                   //деструктор
    Array(const Array& tam);            //конструктор копирования
    T& operator = (Array& tam); //перегрузка операции присваивания
    const T& operator [] (int);         //перегрузка оператора индексирования
    void add();
    void sort_list();                   //сортировка
    void show_list();                   //вывод на экран
};
 
template<class T>Array<T>::Array(int n){
    size = n;
    index = 0;
    if(size > 0){
        if(n){
            mass = new T [size];
        }
        else{
            mass = 0;
        }
    }
    else{
        throw "Отрицательная размерность!!!\n";
    }
}
 
template<class T>Array<T>::Array(const Array& tam){
    size = tam.size;
    index = 0;
    if(size > 0){
        if(tam.mass){
            mass = new T [size];
            for(int i=0;i<size;i++){
                mass[i] = tam.mass[i];
            }
        }
        else{
            mass = 0;
        }
    }
    else{
        throw "Отрицательная размерность!\n";
    }
}
 
template<class T>void Array<T>::show_list(){
    for(int i=0;i<index;i++){
        cout<<mass[i]<<" ";
    }
    cout<<endl;
    //cout<<"Количество занятых ячеек массива: "<<index<<endl;
}
 
template<class T>const T& Array<T>::operator [] (int i){
    if(i < size){
        return mass[i];
    }
    else{
        //throw "Error!";
        cout<<"Error"<<endl;
        exit(1);
    }
}
 
template<class T>void Array<T>::sort_list(){
    for(int i=0;i<size;i++){
        for(int j=0;j<size;j++){
            if(mass[i] < mass[j]){
                T gh = mass[i];
                mass[i] = mass[j];
                mass[j] = gh;
            }
        }
    }
}
 
template<class T>T& Array<T>::operator = (Array& tam){
    if (&tam == this) return *this;//сравнение адресов
    if (mass) delete[] mass;
    size = tam.size;
    if (tam.mass){
        mass = new T [size];
        for(int i=0;i<size;i++){
            mass[i] = tam.mass[i];
        }
    }else
        mass = 0;
    return *this;
}
 
template<class T>void Array<T>::add(){
    T tamp;
    for(int i=0;i<size;i++){
        //system("cls");
        cout<<"Введите значение: ";
        cin>>tamp;
        if(((tamp > 'А')&&(tamp < 'я'))||((tamp > 'a')&&(tamp < 'z'))||((tamp > 0)&&(tamp < 9))){
            mass[i] = tamp;
            ++index;
        }
        else{
            throw 1;
        }
    }
    //system("cls");
}
 
int main(){
    setlocale(LC_ALL,"Russian");
    try{
        Array<char>tam(5);
        while(true){
            try{
                tam.add();
                break;
            }
            catch(int n){
                system("cls");
                cout<<"\nОшибка - "<<n<<endl;
                continue;
            }
        }
        //tam[0] = 'a'; 
        cout<<"\n";
 
        Array<int>lat(5);
        while(true){
            try{
                lat.add();
                break;
            }
            catch(int n){
                system("cls");
                cout<<"\nОшибка - "<<n<<endl;
                continue;
            }
        }
        cout<<"\n";
    
        Array<float>rot(2);
        while(true){
            try{
                rot.add();
                break;
            }
            catch(int n){
                system("cls");
                cout<<"\nОшибка - "<<n<<endl;
                continue;
            }
        }
        cout<<"\n";
        tam.show_list();
        lat.show_list();
        rot.show_list();
    }
    catch(char* str){
        cout<<str<<endl;
    }
return 0;
}
правильно?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
13.11.2010, 02:17 17
Проверку на отрицательный размер в конструкторе копирования совершенно не всек. Как это может быть, если проверка есть в констре по умолчанию?
Ведь априори у объекта этого класса не может быть отрицательного размера...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<class T>Array<T>::Array(const Array& tam){
        size = tam.size;
        index = 0;
        if(size > 0){
                if(tam.mass){
                        mass = new T [size];
                        for(int i=0;i<size;i++){
                                mass[i] = tam.mass[i];
                        }
                }
                else{
                        mass = 0;
                }
        }
}
Этого будет достаточно.
1
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
13.11.2010, 09:03  [ТС] 18
Ага, спс. Эт я так. Просто проверял)))

Добавлено через 20 секунд
По заданию я вроде все выполнил
0
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
15.11.2010, 17:47  [ТС] 19
Почему он ругается, когда я пытаюсь сделать так:
C++
1
 tam[0] = 'a';
0
15.11.2010, 17:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2010, 17:47
Помогаю со студенческими работами здесь

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

Шаблоны классов
Помогите пожалуйста написать шаблон класса двумерный числовой массив(матрица) Методы: конструктор...

Шаблоны классов
Если ли в Ruby возможность создавать шаблоны классов? Т.е. есть ли аналог template &lt;class Type&gt;...

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru