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

Не получается перезгрузка = - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 15:45     Не получается перезгрузка = #1
C++
1
2
3
4
5
6
7
template <class T> Array<T>& Array<T>::operator = ( const Array<T> &t )
    {
        Array<T> ar( t.size );
        for ( int i = 0; i < t.size; i ++ )
            ar[i] = t.p[i];
        return ar;
    }
Ошибки не выдает, но когда присваиваю пустому массиву, массив, заполненный разными объектоми и вывожу полученный массив, то вместо объектов которые были в заполененном массиве, выводятся объекты созданные конструктором по умолчанию( В чем проблема?

Добавлено через 5 минут
Суть кода, можно понять отсюда: Шаблоны классов: контейнер. Несколько вопросов , там только вместо Array - название vect, но там вообще неправильно оператор = перегружен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2012, 15:45     Не получается перезгрузка =
Посмотрите здесь:

C++ треугольник не получается
не получается! C++
C++ Не получается реализовать
C++ Немного не получается
Не получается C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 16:14     Не получается перезгрузка = #2
gore-lykovoe, тут тоже он совершенно неправильно перегружен. Оператор присваивания должен копировать то, что у оператора в правой части, в объект в его левой части. Вы же в своём операторе создаёте зачем-то новый объект, копируете него объект, переданный в оператор, и возвращаете ссылку на этот локальный объект (ссылка по завершении функции будет удалена и получите падение в рантайме скорее всего). Причём после всех этих манипуляций объект, для которого был вызван оператор, так и останется прежним, не изменённым.
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 16:31  [ТС]     Не получается перезгрузка = #3
silent_1991,

Цитата Сообщение от silent_1991 Посмотреть сообщение
Вы же в своём операторе создаёте зачем-то новый объект, копируете него объект, переданный в оператор
так этот объект ведь и есть, то что у оператора в правой части ведь?

вот исправил - работает, но правильно ли все?
C++
1
2
3
4
5
6
7
template <class T> MyArray<T>& MyArray<T>::operator = ( const MyArray<T> &t )
    {
        
        for ( int i = 0; i < t.size; i ++ )
            p [i] = t.p[i];
        return *this;
    }
корректно ли он будет работать, при конструкции типа array3 = array1 + array2; ???
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 16:34     Не получается перезгрузка = #4
gore-lykovoe, смотря как класс устроен изнутри. Статический там массив или динамический. Если динамический - то надо учитывать, что в старом объекте может быть выделено недостаточно памяти для хранения копии массива из нового. В этом случае нужно перевыделить память. Плюс к тому, необходимо проверять, не производится ли попытка присвоить объект самому себе (if (this != &t)).
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 16:44  [ТС]     Не получается перезгрузка = #5
silent_1991, извините пожалуйста за тупой вопрос, но как мне перевыделить память? Через указатель this? Не могли бы вы кодом подсказать? Пожалуйста.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 17:06     Не получается перезгрузка = #6
Вот минимальный вариант рабочего кода.
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
#include <iostream>
 
template<typename T>
class Array
{
public:
    Array(size_t size = 0):
    m_size(size),
    m_array(new T [m_size]())
    {
    }
    
    Array(const Array& source):
    m_size(source.size()),
    m_array(new T [m_size])
    {
        for (size_t i = 0; i < size(); ++i)
            m_array[i] = source[i];
    }
    
    ~Array()
    {
        delete [] m_array;
    }
    
    Array& operator=(const Array& source)
    {
        if (this != &source)
        {
            delete [] m_array;
            
            m_size = source.size();
            m_array = new T [size()];
            
            for (size_t i = 0; i < size(); ++i)
                m_array[i] = source[i];
        }
        
        return *this;
    }
    
public:
    size_t size() const
    {
        return m_size;
    }
    
public:
    T& operator[](size_t index)
    {
        return m_array[index];
    }
    
    const T& operator[](size_t index) const
    {
        return m_array[index];
    }
    
private:
    size_t m_size;
    T *m_array;
};
 
int main()
{
    Array<int> arr1(10);
    
    for (size_t i = 0; i < arr1.size(); ++i)
        arr1[i] = i;
    
    Array<int> arr2(20);
    
    for (size_t i = 0; i < arr2.size(); ++i)
        arr2[i] = i;
    
    for (size_t i = 0; i < arr1.size(); ++i)
        std::cout << arr1[i] << "  ";
    
    std::cout << std::endl;
    
    for (size_t i = 0; i < arr2.size(); ++i)
        std::cout << arr2[i] << "  ";
    
    std::cout << std::endl;
    
    arr1 = arr2;
    
    for (size_t i = 0; i < arr1.size(); ++i)
        std::cout << arr1[i] << "  ";
    
    return 0;
}
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 17:34  [ТС]     Не получается перезгрузка = #7
silent_1991, спасибо большое, с присваивание разобрался, однако я действительно "горе луковое", теперь не могу понять как перезгрузить операцию сложения.
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class T> MyArray<T>& MyArray<T>::operator + ( const MyArray &t )
    {
        MyArray<T> ar( size + t.size ) ;
        for ( int i = 0; i < size; i ++ )
            ar.p[i] = p[ i ];       // копирую объекты из левого операнда в новый массив
 
        for ( int i = size; i < size + t.size; i ++ )
            ar.p[i] = t.p[ i-size ];   // коп. объекты из правого операнда в новый массив
        
        return ar;
 
    }
компилируется, но когда запускаю - выдает
Unhandled exception at 0x0137b060 in test.exe: 0xC0000005: Access violation reading location 0xcccccccc.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 17:34     Не получается перезгрузка = #8
gore-lykovoe, опять то же самое - возвращаете ссылку на временный объект. Возвращайте сам объект - уберите &.
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 17:37  [ТС]     Не получается перезгрузка = #9
точнее он указывает на строчку, где я перегружал операцию присваивания
C++
1
2
3
4
5
6
7
8
9
10
11
template <class T> MyArray<T>& MyArray<T>::operator = ( const MyArray<T> &t )
    {   
        if ( this != &t)
        {
            delete []p;
            p = new T [ t.size ];
            for ( int i = 0; i < t.size; i ++ )
                [COLOR="Red"]p [i] = t.p[i];[/COLOR]
        }
        return *this;
    }
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 17:40     Не получается перезгрузка = #10
gore-lykovoe, во-первых, вы забыли поменять размер в объекте, в который копируете. Во-вторых, он показывает туда, когда вы где-то пытаетесь присвоить результат сложения другому объекту, потому что в этой строчке происходит обращение к удалённой памяти.
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 17:50  [ТС]     Не получается перезгрузка = #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
возвращаете ссылку на временный объект. Возвращайте сам объект - уберите &.
исправил
Цитата Сообщение от silent_1991 Посмотреть сообщение
во-первых, вы забыли поменять размер в объекте, в который копируете
а разве это не должен сделать оператор присваивания? Я как понимаю работу: складываются два массива - запускается оператор сложения, он создает временный массив, который имеет нужный размер, в него все записывается. Дальше запускается оператор присваивания, который уже создаст соответсвенно нужный размер массива.
Я ведь не имею доступа к объекту, в который все копирую перегружая оператор сложения? Вызывает же операцию левый операнд, а правый передается как аргумент.

Цитата Сообщение от silent_1991 Посмотреть сообщение
Во-вторых, он показывает туда, когда вы где-то пытаетесь присвоить результат сложения другому объекту, потому что в этой строчке происходит обращение к удалённой памяти.
тоесть мне надо перегрузить оператор присваивания для этого случая? но как?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 17:55     Не получается перезгрузка = #12
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
создаст соответсвенно нужный размер массива.
Это как же он его "создаст", если вы сами ему не сказали?
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
Я ведь не имею доступа к объекту, в который все копирую перегружая оператор сложения? Вызывает же операцию левый операнд, а правый передается как аргумент.
Пример: строка arr1 = arr2 + arr3;
Исходные значения (будем рассматривать только размеры): arr1(5), arr2(4), arr3(4)
Вызвался оператор +: arr1(5) = @temp(4 + 4 == 8) (@temp - временный объект, хранящий результат сложения)
Вызывается оператор =: arr1(5), хотя фактически он хранит указатель на копию памяти из 8 элементов - результат сложения массивов arr2 и arr3.

Добавлено через 43 секунды
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
тоесть мне надо перегрузить оператор присваивания для этого случая? но как?
Никаких дополнительных случаев. Проблема была не в операторе присваивания, просто проявилась она только в нём. Проблема была в возврате по ссылке на временный объект из оператора сложения.
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 17:59  [ТС]     Не получается перезгрузка = #13
Цитата Сообщение от silent_1991 Посмотреть сообщение
Это как же он его "создаст", если вы сами ему не сказали?
C++
1
2
3
4
5
6
7
8
9
10
11
template <class T> MyArray<T>& MyArray<T>::operator = ( const MyArray<T> &t )
    {   
        if ( this != &t)
        {
            delete []p;
            p = new T [ t.size ];    // так вот вроде!? t.size будет иметь как раз значение 8, так как t - это и будет "временный объект, хранящий результат сложения"
            for ( int i = 0; i < t.size; i ++ )
                p [i] = t.p[i];
        }
        return *this;
    }
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 18:01     Не получается перезгрузка = #14
gore-lykovoe, так а где вы в поле size результата (для которого вызван оператор =) присваиваете размер присваиваемого массива? Ну и что, что теперь указатель p указывает на область памяти из t.size * sizeof(T) байт? Как объект вашего класса об этом должен догадаться?
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 18:04  [ТС]     Не получается перезгрузка = #15
Цитата Сообщение от silent_1991 Посмотреть сообщение
Проблема была в возврате по ссылке на временный объект из оператора сложения.
я удалил ссылку, тоесть теперь так
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class T> MyArray<T> MyArray<T>::operator + ( const MyArray &t )
    {
        MyArray<T> ar( size + t.size ) ;
        for ( int i = 0; i < size; i ++ )
            ar.p[i] = p[ i ];
 
        for ( int i = size; i < size + t.size; i ++ )
            ar.p[i] = t.p[ i-size ];
        
        return ar;
 
    }
Но проблема остлась, теперь он заверашет программу с критической ошибкой так:

Windows has triggered a breakpoint in test.exe.

This may be due to a corruption of the heap, which indicates a bug in lab7.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while test.exe has focus.

The output window may have more diagnostic information.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 18:05     Не получается перезгрузка = #16
gore-lykovoe, что говорит дебаггер?
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 18:10  [ТС]     Не получается перезгрузка = #17
Цитата Сообщение от silent_1991 Посмотреть сообщение
что говорит дебаггер?
ща только в другом проекте запустил, теперь вместо test.exe, будет lab7.exe

'lab7.exe': Loaded 'C:\Users\Desktop\Инфо\lab7\Debug\lab7.exe', Symbols loaded.
'lab7.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\mfc100ud.dll', Symbols loaded.
'lab7.exe': Loaded 'C:\Windows\SysWOW64\msvcr100d.dll', Symbols loaded.
'lab7.exe': Loaded 'C:\Windows\SysWOW64\user32.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\gdi32.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\lpk.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\usp10.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\msvcrt.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\advapi32.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\sechost.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\rpcrt4.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\sspicli.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\cryptbase.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\shlwapi.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.17514_none_ec83dffa859149af\comctl32.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\msimg32.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\oleaut32.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\ole32.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\msvcp100d.dll', Symbols loaded.
'lab7.exe': Loaded 'C:\Windows\SysWOW64\apphelp.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\AppPatch\AcLayers.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\shell32.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\userenv.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\profapi.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\winspool.drv', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\mpr.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\imm32.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\msctf.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\uxtheme.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\dwmapi.dll', Cannot find or open the PDB file
'lab7.exe': Loaded 'C:\Windows\SysWOW64\mfc100rus.dll', Binary was not built with debug information.
'lab7.exe': Loaded 'ImageAtBase0x4acb0000', Loading disabled by Include/Exclude setting.
'lab7.exe': Unloaded 'ImageAtBase0x4acb0000'
HEAP[lab7.exe]: Invalid address specified to RtlValidateHeap( 00030000, 0003B8B8 )
Windows has triggered a breakpoint in lab7.exe.

This may be due to a corruption of the heap, which indicates a bug in lab7.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while lab7.exe has focus.

The output window may have more diagnostic information.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 18:14     Не получается перезгрузка = #18
gore-lykovoe, код выложите.
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 18:14  [ТС]     Не получается перезгрузка = #19
Цитата Сообщение от silent_1991 Посмотреть сообщение
так а где вы в поле size результата (для которого вызван оператор =) присваиваете размер присваиваемого массива?
так когда я для операции "+" создаю временный объект, поле size автоматически станет равным 8, так - как это есть в конструкторе с параметром. Соотвественно, когда будет запускать оператор "=" и как аргумент пойдет этот временный объет, то поле size уже будет равно 8.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2012, 18:15     Не получается перезгрузка =
Еще ссылки по теме:

Не получается C++
C++ Не получается с функциями
Не получается список C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 18:15     Не получается перезгрузка = #20
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
поле size автоматически станет равным 8
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
поле size уже будет равно 8
Поле size временного объекта, но не результирующего, в который происходит копирование.
Yandex
Объявления
15.04.2012, 18:15     Не получается перезгрузка =
Ответ Создать тему
Опции темы

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