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

Перегрузка операторов в классе - C++

Восстановить пароль Регистрация
 
legoner
0 / 0 / 0
Регистрация: 03.05.2014
Сообщений: 3
03.05.2014, 21:22     Перегрузка операторов в классе #1
Здравствуйте.

Написал класс:
C++ (Qt)
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
template <class T>
class LIST
{
    private:
        T* listP;
        uint lSize;     
    public:
        LIST();
        LIST(const T*,uint);
 
        void SetList(const T*,uint);//задать лист       
        bool Add(const T&);//добавить элемент
        bool Delete(uint);//удалить элемент
        void Clear();//очистить список
 
        bool IsNull();//пустой?
        T GetElement(uint);
 
        LIST<T> & operator=(const LIST<T> &);//присваивает списки
        LIST<T> operator+(const LIST<T> &);//совмещает списки
 
        template <class T> friend  ostream & operator<< (ostream & ,const LIST<T> &);//вывод листа в поток
 
        ~LIST();
};
Определил операторы:

C++ (Qt)
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
template <class T>
LIST<T> & LIST<T>::operator=(const LIST<T> & l)
{
    if (&l == this) return *this;
    lSize = l.lSize;
    if (listP != NULL) delete [] listP;
    listP = new T[lSize];
 
    for (int i = 0; i < lSize; i++)
        listP[i] = l.listP[i];
 
    return *this;
}
 
template <class T>
LIST<T> LIST<T>::operator+(const LIST<T> & l)
{
    uint size = lSize + l.lSize;
    if (size > LIST_MAX_SIZE) size = LIST_MAX_SIZE;
    if (size == 0)
    {
        LIST<T> result = LIST(NULL,size);
        return result;
    }
    
    
    T* arr = new T[size];
    uint sie = 0;
    for (sie; sie < lSize; sie++)
        arr[sie] = listP[sie];
    
    for (int i = 0; i + sie < size; i++)
        arr[sie+i] = l.listP[i]; 
 
    LIST<T> result = LIST(arr,size);//LIST<T> не нравится
    delete [] arr;
    return result;
}
Однако, я где-то упускаю из вида какую-то важную деталь, т.к. данный код работает не корректно.
Класс result создаётся, вроде, правильно ...
Однако, когда возвращаемый параметр передаётся оператору "="
C++ (Qt)
1
2
3
//int main() 
list = (list + list2);
return 0;
то первый элемент массива принимает совершенно странное значение, как будто вовсе не инициализирован.
Помимо этого, после выхода из функции, вылезает ошибка (см. картинку).

Помогите, пожалуйста, разобраться в чём дело...
Миниатюры
Перегрузка операторов в классе  
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
03.05.2014, 21:48     Перегрузка операторов в классе #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
list = (list + list2);

у вас оператор + возвращает объект, который конструируется копирующим конструктором, которого у вас нет. т.е. вызывается дефолтный, а он не корректный. нужно свой написать.

корректность остального кода не смотрел.
legoner
0 / 0 / 0
Регистрация: 03.05.2014
Сообщений: 3
03.05.2014, 22:03  [ТС]     Перегрузка операторов в классе #3
Да, благодарю. Этот момент я из вида упустил.
Добавил в код и всё прекрасно заработало:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class T>
LIST<T>::LIST(LIST<T> & l)
{
    uint size = l.lSize;
 
    if (size > LIST_MAX_SIZE) size = LIST_MAX_SIZE;
    if (size > 0)
        listP = new T[size];
    else
        listP = NULL;
 
    for (int i = 0; i < size; i++)
        listP[i] = l.listP[i];
    lSize = size;
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
03.05.2014, 22:07     Перегрузка операторов в классе #4
криво. не будет конструироваться из константных объектов.
обычно конструктор копий принимает константную ссылку.
не константная ссылка - в каких-то экзотических случаях, не считая std::auto_ptr
legoner
0 / 0 / 0
Регистрация: 03.05.2014
Сообщений: 3
03.05.2014, 22:16  [ТС]     Перегрузка операторов в классе #5
Спасибо, исправил.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class T>
LIST<T>::LIST(const LIST<T> & l)
{
    lSize = l.lSize;
 
    if (lSize > LIST_MAX_SIZE) lSize = LIST_MAX_SIZE;
    if (lSize > 0)
        listP = new T[lSize];
    else
        listP = NULL;
 
    for (int i = 0; i < lSize; i++)
        listP[i] = l.listP[i];
    
}
Yandex
Объявления
03.05.2014, 22:16     Перегрузка операторов в классе
Ответ Создать тему
Опции темы

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