С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kuli4ok
32 / 32 / 3
Регистрация: 10.10.2012
Сообщений: 88
#1

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

17.11.2012, 17:31. Просмотров 369. Ответов 7
Метки нет (Все метки)

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
#include <stdio.h>
#include <stdlib.h>
 
class matrix
{
protected:
    int **mass;
    int n;
public:
    matrix()
    {
        n = 5;
        mass = new int*[n];
        for(int i=0; i<n; i++)
        {
            mass[i] = new int[n];
        }
    }
    ~matrix()
    {
        for(int i=n-1; i>=0; i--)
        {
            delete [] mass[i];
        }
    }
    matrix(const matrix &o)
    {
        n = o.n;
        mass = new int*[n];
        for(int i=0; i<n; i++)
        {
            mass[i] = new int[n];
        }
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                mass[i][j] = o.mass[i][j];
            }
        }
    }
    void show()
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                printf("%d ", mass[i][j]);
            }
            printf("\n");
        }
    }
    void get_rand()
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                mass[i][j] = rand()%10;
            }
        }
    }
    matrix operator+(matrix o)
    {
        matrix m;
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                m.mass[i][j] = mass[i][j] + o.mass[i][j];
            }
        }
        return m;
    }
};
 
int main()
{
    matrix o1, o2;
    o1.get_rand();
    o2.get_rand();
    o1.show();
    printf("\n");
    o2.show();
    matrix o3;
    o3 =o1+o2;
    printf("\n");
    o3.show();
    return 0;
}
Здесь перегружен оператор + для сложения элементов матрицы, но почему то он складывает все элементы за исключением первого столбца.
Пример выходных данных:

3 6 7 5 3
5 6 2 9 1
2 7 0 9 3
6 0 6 2 6
1 8 7 9 2

0 2 3 7 5
9 2 2 8 9
7 3 6 1 2
9 3 1 9 4
7 8 4 5 0

134525712 8 10 12 8
134525736 8 4 17 10
134525760 10 6 10 5
134525784 3 7 11 10
0 16 11 14 2

Подскажите, пожалуйста, в чем проблема?
p.s. только начал изучать перегрузку операторов, сильно не пинайте
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2012, 17:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка операторов (C++):

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this - C++
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...

Перегрузка операторов - C++
Доброго всем времени суток!Пожалуйста помогите мне неучу разобраться.Пытаюсь разобраться с классами,но пока безуспешно без посторонней...

Перегрузка операторов - C++
Доброго времени суток. на завтра надо сделать работу, а я не могу понять как использовать перегрузку операторов. помогите пожалуйста...

Перегрузка операторов - C++
Всем Hello world! Изучаю C++, сейчас дошёл до классов, а точнее до перегрузки операторов. Решил в учебных целях написать класс, который...

Перегрузка операторов - C++
написал программу. проверил. вроде все правильно. но не работает. программа долjна посредством перегрузки знака = скопировать из строки S1...

[c++] Перегрузка операторов - C++
Для заданных A = (A – a1, A, A + a2) и B = (B – b1, B, B + b2) Найти сумму A + B = (A + B – a1 – b1, A + B, A + B + a2 + b2); ...

7
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.11.2012, 17:44 #2
Вы возвращаете временный объект.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
    matrix & operator+(matrix & o)
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                mass[i][j] = mass[i][j] + o.mass[i][j];
            }
        }
        return *this;
    }
попробуйте так(не проверял, просто взбрело в голову).
1
kuli4ok
32 / 32 / 3
Регистрация: 10.10.2012
Сообщений: 88
17.11.2012, 17:46  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы возвращаете временный объект.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
    matrix & operator+(matrix & o)
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                mass[i][j] = mass[i][j] + o.mass[i][j];
            }
        }
        return *this;
    }
попробуйте так(не проверял, просто взбрело в голову).
Да, теперь работает как надо, спасибо.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.11.2012, 17:50 #4
проблема не в этом, а в том что у вас нет оператора =.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
matrix o3;
o3 =o1+o2;  // тут работает оператор = а не конструктор копирования. а дефолтный будет приводить к проблемам.
 
// вот это добавте к себе в код:
    matrix& operator = (const matrix &o)
    {
      matrix m(o);
      int** tmpMass = mass;
      int tmpN = n;
      mass = m.mass;
      n = m.n;
      m.mass = tmpMass;
      m.n = tmpN;
      return *this;
    }
 
//и привильная сигнатура operator + должна быть такой:
matrix operator + (const matrix & o) const;
 
matrix & operator+(matrix & o); // это для оператора +=
 
и еще в деструкторе у вас пропущено удаление
delete [] mass;
1
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.11.2012, 17:53 #5
Цитата Сообщение от DU Посмотреть сообщение
проблема не в этом, а в том что у вас нет оператора =.
Есть конструктор копий
0
kuli4ok
32 / 32 / 3
Регистрация: 10.10.2012
Сообщений: 88
17.11.2012, 17:54  [ТС] #6
Цитата Сообщение от DU Посмотреть сообщение
проблема не в этом, а в том что у вас нет оператора =.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
matrix o3;
o3 =o1+o2;  // тут работает оператор = а не конструктор копирования. а дефолтный будет приводить к проблемам.
 
// вот это добавте к себе в код:
    matrix& operator = (const matrix &o)
    {
      matrix m(o);
      int** tmpMass = mass;
      int tmpN = n;
      mass = m.mass;
      n = m.n;
      m.mass = tmpMass;
      m.n = tmpN;
      return *this;
    }
 
//и привильная сигнатура operator + должна быть такой:
matrix operator + (const matrix & o) const;
 
matrix & operator+(matrix & o); // это для оператора +=
 
и еще в деструкторе у вас пропущено удаление
delete [] mass;
Ну я же говорю, что только начал перегрузку, а про перегруженный оператор присвоения еще не читал, точнее было написано, что будет рассмотрен далее, но все равно спасибо.
p.s. А вот с деструктором действительно пропустил, сам себе удивлюсь
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.11.2012, 18:00 #7
Есть конструктор копий
И что? Как его наличие поможет в случае, когда компилятор генерирует вызов оператора =?
у автора изначально его не было, а тот, который генерится по умолчанию работает не верно, котому что производит не глубокое копирование, как конструктор копирования, а лишь поверхностное.

o3 =o1+o2 - что тут происходит.
в результате сложения создается временный объект, в котором результат сложения.
далее для o3 вызывается дефолтный оператор = которому передается ссылка на этот временный объект и оператор просто копирует указатели.
в результате временный объект и o3 указывают на один и тот же массив. потом временный объект удаляется,
и в своем деструкторе подчищает за собой. в результате в o3 переменная mass указывает на то, что только что удалил временный объект.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.11.2012, 18:07 #8
Цитата Сообщение от DU Посмотреть сообщение
o3 =o1+o2 - что тут происходит.
я функцию main не смотрел. Думал, что там все корректно.
0
17.11.2012, 18:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2012, 18:07
Привет! Вот еще темы с ответами:

Перегрузка операторов - C++
Добрый вечер, вопрос в том, что я пытаюсь перегрузить оператор ++ постфиксно, но на нем падает программа, а перегруженный префиксно...

[C++] Перегрузка операторов - C++
Помогите пожалуйста перегрузить операторы в матрице: +=, i++, != и Перегрузил *= но не уверен, что так надо =\ Буду очень...

Перегрузка операторов - C++
Столкнулся с проблемой при написании лабораторной по перегрузке операторов. Задание таково: описать класс, содержащий координаты отрезка,...

перегрузка операторов - C++
Встала проблема с перегрузкой операторов. Обычные типа --, или += я вроде как написать смог, но встали ошибки с перегрузкой операторов &lt;&lt; и...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.