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

Ошибка перегрузки + в классе - C++

Восстановить пароль Регистрация
 
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
01.02.2013, 17:58     Ошибка перегрузки + в классе #1
Не понимаю в чём проблема, ошибка возникает во время работы программы, сообщает что продолжается запись после работы этого блока.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 template <class T>
array<T> array<T>::operator +(const array<T>& A){
    array<T> temp;
    size > A.size ? temp.size = size : temp.size = A.size;
    temp.ptr = new T[size] ;
    for(size_t i = 0; i < temp.size; i++){
        if( (i < this->size) && (i< A.size))//проверяю размерность операндов
            temp.ptr[i] = this->ptr[i] + A.ptr[i];
        else if ( i >= this -> size)//если массив короче просто добавляю элементы массиа А
            temp.ptr[i] = A.ptr[i];
        else
            temp.ptr[i] = this->ptr[i];//если А короче дописываю своими элементами
    }
    return temp;//с этого места показывает ошибку
}
Миниатюры
Ошибка перегрузки + в классе  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.02.2013, 19:28     Ошибка перегрузки + в классе #2
конструктор копирования определен?

Добавлено через 1 минуту
Цитата Сообщение от Alexxx7 Посмотреть сообщение
C++
1
size > A.size ? temp.size = size : temp.size = A.size;
C++
1
temp.size = size > A.size ? size : A.size;
концептуально правильнее определить оператор +=, а оператор + реализовать как внешнюю функцию
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
01.02.2013, 19:33  [ТС]     Ошибка перегрузки + в классе #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
template <class T>
array<T>::array(){
    ptr = NULL;
    size = 0;
}
template <class T>
array<T>::array(size_t size){
    ptr = new T[size] = {0};
    this->size = size;
}
template <class T>
array<T>::array(const array<T>& A){
    this->size = A.size;
    ptr = new T[size];
    if(!ptr)
        cout<<"Error memory!!!\n";
    else 
        for(size_t i = 0; i < size; i++)
            this->ptr[i] = A.ptr[i];    
}
template <class T>
array<T>& array<T>::operator = (const array<T>& A){
    if(this == &A)//проверка на самоприсваивание
        return (*this);
    if(size != 0)
        delete []ptr;
    size = A.size;
    ptr = new T[size];
    for(size_t i = 0; i < size; i++)
        ptr[i] = A.ptr[i];
    return (*this);
}
template <class T>
 T & array<T>::operator [](size_t size){
     T temp = 0;
    if( 0 <= size && size < this->size ) 
        return this->ptr[ size ];
    else{
        cout<<"Vne diapazona!!!"<<endl;
        return temp;
    }
}
 template <class T>
array<T> array<T>::operator +(const array<T>& A){
    array<T> temp;
    size > A.size ? temp.size = size : temp.size = A.size;
    temp.ptr = new T[size] ;
    for(size_t i = 0; i < temp.size; i++){
        if( (i < this->size) && (i< A.size))//проверяю размерность операндов
            temp.ptr[i] = this->ptr[i] + A.ptr[i];
        else if ( i >= this -> size)//если массив короче просто добавляю элементы массиа А
            temp.ptr[i] = A.ptr[i];
        else
            temp.ptr[i] = this->ptr[i];//если А короче дописываю своими элементами
    }
    return temp;
}
 template <class T>
array<T> array<T>::operator -(const array<T>& A){
    array<T> temp;
    size > A.size ? temp.size = size : temp.size = A.size;
    temp.ptr = new T[size] ;
    for(size_t i = 0; i < temp.size; i++){
        if( (i < this->size) && (i< A.size))//проверяю размерность операндов
            temp.ptr[i] = this->ptr[i] - A.ptr[i];
        else if ( i >= this -> size)//если массив короче просто добавляю элементы массиа А
            temp.ptr[i] = A.ptr[i];
        else
            temp.ptr[i] = this->ptr[i];//если А короче дописываю своими элементами
    }
    return temp;
}
template <class T>
bool array<T>::chekSize( size_t size){
    this->size < size? return false: return true;
}
 
template <class T>
bool array<T>::empty(void){
    if(size == 0)
        return true;
    else 
        return false;
}
template <class T>
void array<T>::pushEnd(const T& volue){
    if(ptr == NULL){
        ptr = new T[size+1];
        ptr[size] = volue;
    }
    else{
        T *temp = new T[size+1];
        for(size_t i = 0; i<size; i++)
            temp[i] = ptr[i];
        temp[size] = volue;
        delete []ptr;
        ptr = temp;
    }
    size++;
}
template <class T>
void array<T>:: EraseEnd(void){
    if(empty())
        cout<<"Array is empty\n";
    else{
        size--;
        T *temp = new T[size];
        for(size_t i = 0; i<size; i++)
            temp[i] = ptr[i];
        delete []ptr;
        ptr = temp;
    }
}
template <class T>
void array<T>::show(void){
    cout<<"Show:\n";
    for(size_t i = 0; i<size; i++)
            cout<<ptr[i]<<" ";
    cout<<endl;
}
template <class T>
array<T>::~array(void){
    delete []ptr;
}
Добавлено через 3 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
temp.size = size > A.size ? size : A.size;
не помогло
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.02.2013, 19:34     Ошибка перегрузки + в классе #4
Цитата Сообщение от Alexxx7 Посмотреть сообщение
C++
1
temp.ptr = new T[size] ;
C++
1
temp.ptr = new T[temp.size];
Цитата Сообщение от Alexxx7 Посмотреть сообщение
не помогло
и не должно, эта поправка была к тому что так код понятнее
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
01.02.2013, 19:40  [ТС]     Ошибка перегрузки + в классе #5
да надо же быть таким невнимательным
Jupiter
01.02.2013, 19:50
  #6

Не по теме:

Цитата Сообщение от Alexxx7 Посмотреть сообщение
да надо же быть таким невнимательным
конечно когда в глазах такие:
Цитата Сообщение от Alexxx7 Посмотреть сообщение
size > A.size ? temp.size = size : temp.size = A.size;
Цитата Сообщение от Alexxx7 Посмотреть сообщение
this->size < size? return false: return true;
Цитата Сообщение от Alexxx7 Посмотреть сообщение
if(size == 0)
* * * * return true;
* * else
* * * * return false;
- бревна

Цитата Сообщение от Alexxx7 Посмотреть сообщение
ptr = new T[size];
* * if(!ptr)
и для чего эта проверка?

MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
01.02.2013, 19:55     Ошибка перегрузки + в классе #7
Цитата Сообщение от Jupiter Посмотреть сообщение

Не по теме:

и для чего эта проверка?

Первые реализации new возвращали 0, если не выделяли память, а не кидали std::bad_alloc.
Это я так, к слову. Замечание действительно имеет право быть, т.к. вариант того, что ТС работает на подобном компиляторе крайне мала.
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
01.02.2013, 20:06  [ТС]     Ошибка перегрузки + в классе #8
Jupiter, Спасибо за замечания, с new всё ясно, а про остальные брёвна просветите.
"В случае успешного завершения операция new возвращает указатель со значением, отличным от нуля.
Результат операции, равный 0, т.е. нулевому указателю NULL, говорит о том, что не найден непрерывный свободный фрагмент памяти нужного размера." так у меня в учебных материаллах написано с курсов, видно живут вчерашним днём.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
01.02.2013, 20:11     Ошибка перегрузки + в классе #9
Alexxx7, тернарным оператором не умеете пользоваться, все вышенаписанное можно с легкостью заменить на более понятный и короткий вариант.
C++
1
temp.size = (size > A.size ?  size : A.size);
C++
1
return this->size > size;
C++
1
return size == 0;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2013, 20:31     Ошибка перегрузки + в классе
Еще ссылки по теме:

explicit конструктор и перегрузки в классе C++
C++ Ошибка из книги оператора перегрузки
C++ Ошибка в классе

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

Или воспользуйтесь поиском по форуму:
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
01.02.2013, 20:31  [ТС]     Ошибка перегрузки + в классе #10
MrGluck, Реально примного благодарен, если чесно даже не думал что так можно, или правильней просто даже не думал, ещё раз спасибо.
Yandex
Объявления
01.02.2013, 20:31     Ошибка перегрузки + в классе
Ответ Создать тему
Опции темы

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