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

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

Восстановить пароль Регистрация
 
kuli4ok
31 / 31 / 3
Регистрация: 10.10.2012
Сообщений: 88
17.11.2012, 17:31     Перегрузка операторов #1
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. только начал изучать перегрузку операторов, сильно не пинайте
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2012, 17:31     Перегрузка операторов
Посмотрите здесь:

Перегрузка операторов C++
C++ Перегрузка операторов
Перегрузка операторов С++ C++
C++ перегрузка операторов
Перегрузка операторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,841
Записей в блоге: 2
Завершенные тесты: 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;
    }
попробуйте так(не проверял, просто взбрело в голову).
kuli4ok
31 / 31 / 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;
    }
попробуйте так(не проверял, просто взбрело в голову).
Да, теперь работает как надо, спасибо.
DU
1477 / 1053 / 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;
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,841
Записей в блоге: 2
Завершенные тесты: 1
17.11.2012, 17:53     Перегрузка операторов #5
Цитата Сообщение от DU Посмотреть сообщение
проблема не в этом, а в том что у вас нет оператора =.
Есть конструктор копий
kuli4ok
31 / 31 / 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. А вот с деструктором действительно пропустил, сам себе удивлюсь
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.11.2012, 18:00     Перегрузка операторов #7
Есть конструктор копий
И что? Как его наличие поможет в случае, когда компилятор генерирует вызов оператора =?
у автора изначально его не было, а тот, который генерится по умолчанию работает не верно, котому что производит не глубокое копирование, как конструктор копирования, а лишь поверхностное.

o3 =o1+o2 - что тут происходит.
в результате сложения создается временный объект, в котором результат сложения.
далее для o3 вызывается дефолтный оператор = которому передается ссылка на этот временный объект и оператор просто копирует указатели.
в результате временный объект и o3 указывают на один и тот же массив. потом временный объект удаляется,
и в своем деструкторе подчищает за собой. в результате в o3 переменная mass указывает на то, что только что удалил временный объект.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2012, 18:07     Перегрузка операторов
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,841
Записей в блоге: 2
Завершенные тесты: 1
17.11.2012, 18:07     Перегрузка операторов #8
Цитата Сообщение от DU Посмотреть сообщение
o3 =o1+o2 - что тут происходит.
я функцию main не смотрел. Думал, что там все корректно.
Yandex
Объявления
17.11.2012, 18:07     Перегрузка операторов
Ответ Создать тему
Опции темы

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