Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
32 / 32 / 17
Регистрация: 10.10.2012
Сообщений: 88

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

17.11.2012, 17:31. Показов 852. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.11.2012, 17:31
Ответы с готовыми решениями:

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

[c++] Перегрузка операторов
Не работает. #include &lt;conio.h&gt; #include &lt;iostream.h&gt; #pragma argsused struct FazzyNumber { double x; double x1,x2; ...

Перегрузка операторов
Привет, у меня есть код, но когда я его делал у меня возникла пара вопросов. #include &lt;iostream&gt; #include &lt;iomanip&gt; ...

7
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
17.11.2012, 17:44
Вы возвращаете временный объект.

Добавлено через 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
32 / 32 / 17
Регистрация: 10.10.2012
Сообщений: 88
17.11.2012, 17:46  [ТС]
Цитата Сообщение от 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
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
17.11.2012, 17:50
проблема не в этом, а в том что у вас нет оператора =.
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
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
17.11.2012, 17:53
Цитата Сообщение от DU Посмотреть сообщение
проблема не в этом, а в том что у вас нет оператора =.
Есть конструктор копий
0
32 / 32 / 17
Регистрация: 10.10.2012
Сообщений: 88
17.11.2012, 17:54  [ТС]
Цитата Сообщение от 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
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
17.11.2012, 18:00
Есть конструктор копий
И что? Как его наличие поможет в случае, когда компилятор генерирует вызов оператора =?
у автора изначально его не было, а тот, который генерится по умолчанию работает не верно, котому что производит не глубокое копирование, как конструктор копирования, а лишь поверхностное.

o3 =o1+o2 - что тут происходит.
в результате сложения создается временный объект, в котором результат сложения.
далее для o3 вызывается дефолтный оператор = которому передается ссылка на этот временный объект и оператор просто копирует указатели.
в результате временный объект и o3 указывают на один и тот же массив. потом временный объект удаляется,
и в своем деструкторе подчищает за собой. в результате в o3 переменная mass указывает на то, что только что удалил временный объект.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
17.11.2012, 18:07
Цитата Сообщение от DU Посмотреть сообщение
o3 =o1+o2 - что тут происходит.
я функцию main не смотрел. Думал, что там все корректно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.11.2012, 18:07
Помогаю со студенческими работами здесь

Перегрузка операторов
Решите пожалуйсто задачу: Разработайте программу, в которой реализована перегрузка оператора «^». Оператор «^» должен возводить...

Перегрузка операторов
Приветствую! Необходима помощь. Разработать класс Vec4 как вектор из 4-х float. Определить оператор ~ для перестановки элементов вектора...

Перегрузка операторов
Добрый вечер. Не подскажите, в чём дело? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; struct programTime { programTime() { ...

Перегрузка операторов
Всем привет. Мне нужно ввести класс для работы с объектом &quot;рациональная дробь&quot; вида (m / n) (рациональная дробь это дробь у которого...

Перегрузка операторов
#include&lt;locale&gt; #define MAX 20 class Base { public: float **arr; int size; int size2; Base(void);


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru