Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
1

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

15.04.2012, 15:45. Показов 2773. Ответов 53
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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, но там вообще неправильно оператор = перегружен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2012, 15:45
Ответы с готовыми решениями:

Перезгрузка метода с одинаковыми параметрами
class Figure { public: virtual string getName() = 0; virtual double...

Загрузить видео вконтакте. Странно получается. Почему так получается?
Решил згрузить в контакт Мультфильм Дикая планета...

Почему не получается получить и изменить ul через js по id? А что выше id получается
все данные классы находятся в меню шапке 1 работает а 2 нет сайт...

Дифференциальное уравнение второго порядка не получается в получается в маткаде
Дифференциальное уравнение второго порядка не получается в маткаде. Помогите решить

53
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 18:19  [ТС] 21
Author24 — интернет-сервис помощи студентам
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
template <class T>  class MyArray
    {
        T *p;
        int size;
    public:
        MyArray( );
        MyArray( int s );
        ~MyArray( );
        MyArray& operator = ( const MyArray &t );
        MyArray operator + ( const MyArray &t );
        T& operator [] ( int k );
    };
    
    template <class T> MyArray<T>::MyArray()
    {
        size = 100;
        p = new T[size];
    }
 
    template <class T> MyArray<T>::MyArray( int s )
    {
        size = s;
        p = new T[size];
    }
 
    template <class T> MyArray<T>::~MyArray()
    {
        delete []p;
    }
    
    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 ++ )
                p [i] = t.p[i];
        }
        return *this;
    } 
    
    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;
 
    }
    template <class T> T& MyArray<T>::operator [] ( int k )
    {
    if ( k < 0 || k >= size )
    {
        cout << "Ошибка, неккоректный индекс" << endl;
        exit( 0 );
    }
    else
        return p[ k ];
    
    }
Добавлено через 3 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
Поле size временного объекта, но не результирующего, в который происходит копирование.
так, немного не понял, так поле t.size будет равно 8, когда мы перегружаем "=" ?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.04.2012, 18:20 22
Вот на такой функции main ваш код отработал. Тем не менее то, что вы не изменяете размер - ошибка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    MyArray<int> arr1(5), arr2(3), arr3(3);
    
    arr2[0] = arr3[0] = 10;
    arr2[1] = arr3[1] = 20;
    arr2[2] = arr3[2] = 30;
    
    arr1 = arr2 + arr3;
    
    return 0;
}
Добавлено через 58 секунд
gore-lykovoe, поле t.size будет равно 8. Только вот какой от этого прок, если после отработки оператора = поле объект, к которому происходит присваивание, останется таким же, как и до присваивания?
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 18:25  [ТС] 23
Цитата Сообщение от silent_1991 Посмотреть сообщение
поле объект, к которому происходит присваивание, останется таким же, как и до присваивания?
так там же есть строчка
C++
1
p = new T [ t.size ];
Поле ведь изменится!?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.04.2012, 18:26 24
gore-lykovoe, вот каким образом изменение указателя на область памяти влияет на целочисленную переменную, хранящую размер, скажите на милость?
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 18:27  [ТС] 25
Цитата Сообщение от silent_1991 Посмотреть сообщение
Вот на такой функции main ваш код отработал.
вставил его к себе, скомпилировал, нормально, только у меня там system("pause") есть в самом конце, после нажатия на "продолжить", программа завершилась с критической ошибкой. (прошлой)
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.04.2012, 18:29 26
gore-lykovoe, http://liveworkspace.org/code/... 21ecf0780a
Специально вставил перед возвратом из оператора присваивания распечатку размера массива после выполнения оператора (по логике должен быть 6).
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 18:32  [ТС] 27
Цитата Сообщение от silent_1991 Посмотреть сообщение
вот каким образом изменение указателя на область памяти влияет на целочисленную переменную, хранящую размер, скажите на милость?
оно не влияет, но я не понял почему вы задаете такой вопрос.
Цитата Сообщение от silent_1991 Посмотреть сообщение
поле объект, к которому происходит присваивание, останется таким же, как и до присваивания
я так думал, что эта строчка как-раз и изменит поле объект, к которому происходит присваивание.

если не сложно, можете сказать тогда - как исправить? Сделать отдельную функцию size(), как у вас в примере? Я просто не понимаю, что она изменит.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.04.2012, 18:34 28
gore-lykovoe, метод size по-любому нужен для полноты, но вы приглядитесь лучше к 32 строке моего кода. Внимательно приглядитесь.

Цитата Сообщение от gore-lykovoe Посмотреть сообщение
я так думал, что эта строчка как-раз и изменит поле объект, к которому происходит присваивание.

Изменит. Но какое поле, по вашему, она изменит?
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 18:35  [ТС] 29
Цитата Сообщение от silent_1991 Посмотреть сообщение
по логике должен быть 6
странно, тоесть в этом проблема?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.04.2012, 18:36 30
gore-lykovoe, нет, вы же видели по ссылке, что код отрабатывает и завершается нормально. Но проблема, тем не менее есть, и я удивлён, что у вас такие трудности с её пониманием.
0
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 18:43  [ТС] 31
Цитата Сообщение от silent_1991 Посмотреть сообщение
но вы приглядитесь лучше к 32 строке моего кода
m_size = source.size();
в этой строчке мы получим размер временного объекта size, может вы 33 имели ввиду?


Цитата Сообщение от silent_1991 Посмотреть сообщение
Изменит. Но какое поле, по вашему, она изменит?
вы имели ввиду - чье поле она изменит? Поле объекта, который вызывает присваивание, тоесть в который и будет все копироваться.

Возможно я туплю очень? Или провалы в знаниях?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.04.2012, 18:46 32
gore-lykovoe, не пытайтесь догадаться, что и имел ввиду. По моему предыдущему сообщению это вполне ясно. Я указал на верную строку в своём коде. И чётко написал: "какое поле будет изменено". Какое, а не чьё.

Добавлено через 2 минуты
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
мы получим размер временного объекта size
Мы его не просто получили. Мы сделали главное - присвоили его.
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 18:47  [ТС] 33
Цитата Сообщение от silent_1991 Посмотреть сообщение
какое поле будет изменено
будет изменен указатель на динамическую память, тоесть теперь поместятся в эту память все объекты
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.04.2012, 18:48 34
gore-lykovoe, так. А что будет с полем size?
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 18:51  [ТС] 35
Цитата Сообщение от silent_1991 Посмотреть сообщение
Мы сделали главное - присвоили его.
понял, исправлю

Добавлено через 1 минуту
Цитата Сообщение от silent_1991 Посмотреть сообщение
так. А что будет с полем size?
понял, это конечно очень не правильно, но это не должно было влиять на работу программы. Не понимаю, почему у меня ошибки сыпятся(
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.04.2012, 18:52 36
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
временного объекта
Кстати, там будет не обязательно ссылка на временный объект. Мы можем один массив присваивать другому, тогда там будет ссылка на обычный объект, созданный нами собственноручно.

Добавлено через 28 секунд
gore-lykovoe, это и не влияет. Можете ещё раз сходить по ссылке выше.
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 18:59  [ТС] 37
Цитата Сообщение от silent_1991 Посмотреть сообщение
Можете ещё раз сходить по ссылке выше.
я вывел значения полученного массива arr1, все они равны рандомным числам. Поэтому видать ошибку в конце и выдает. Только я не понимаю, почему числа рандомные(
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.04.2012, 19:01 38
gore-lykovoe, http://liveworkspace.org/code/... 7fd156903e
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
15.04.2012, 19:25  [ТС] 39
Цитата Сообщение от silent_1991 Посмотреть сообщение
http://liveworkspace.org/code/2ec407...2a627fd156903e
чудеса какие то, надо пересоздать проект пожалуй

Добавлено через 21 минуту
Цитата Сообщение от silent_1991 Посмотреть сообщение
http://liveworkspace.org/code/2ec407...2a627fd156903e
вообщем создал новый проект, скопировал код с сайта этого, не работает, выдает левые значения и завершается с ошибкой. Видать дело в среде. Я под VS-2010. Вы можете попробывать у себя запустить, пожалуйста? Или что мне делать?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
15.04.2012, 19:33 40
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
Я под VS-2010. Вы можете попробывать у себя запустить, пожалуйста? Или что мне делать?
а теперь подробно шаг за шагом опиши что делаешь, как создаешь проект, какие ошибки
0
15.04.2012, 19:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2012, 19:33
Помогаю со студенческими работами здесь

Получается одно и тоже значение. Постоянно получается значение legit. Заранее спасибо!
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #define eps 0,001 int main() { float t,x,e,y; ...


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

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