Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 15

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

03.05.2016, 09:50. Показов 1265. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Сделал класс квадратной матрицы. Содержит конструктор по умолчанию, конструктор с параметрами, конструктор копирования, деструктор, метод потокового ввода и вывода. Все это работает.
Не получается реализовать бинарную и логическую перегрузку + ==.

Заголовочный файл.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Matrix
{
    int n;                                          
    int A[10][10];                                  
public:
    Matrix();                                       
    Matrix(int xn, int* xA);                        
    Matrix(Matrix &);                               
    ~Matrix();                                      
    void Print();                                   
    void Input();                                   
    Matrix operator + (Matrix &rhs);
    bool operator == (Matrix &rhs);
};
Методы класса
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
Matrix::Matrix() :n(2)      //конструктор по умолчанию. размер матрицы 2 и заполнена 0
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            A[i][j] = 0;
    }
}
...
bool Matrix::operator == (Matrix &rhs)//размерность матрицы не важна, лишь бы суммы элементов были равны
{
    int s1, s2;
    s1 = s2 = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            s1 += A[i][j];
    for (int i = 0; i < rhs.n; i++)
        for (int j = 0; j < rhs.n; j++)
            s2 += rhs.A[i][j];
    if (s1 == s2)
        return true;
    return false;
}
Matrix Matrix::operator + (Matrix &rhs)
{
}
Создаю через main element1 и element2, пытаюсь сравнить и всегда получаю ответ не равны. Хотя сам их создаю равными.
Пытался смотреть через отладчик, что происходит. Когда программа доходит до места сравнения if, но нажимая шаг с заходом, она не переходит в метода класса, где описана перегрузка, а просто идет в else и выводит "Не равны".

Main.
C++
1
2
3
4
5
6
7
8
Matrix **MatrixArray = new Matrix*[size];
...
MatrixArray[element] = new Matrix();
...
if (MatrixArray[element1] == MatrixArray[element2])
        cout << "Равны";
    else
        cout << "Не равны";
Что я делаю не так?
И может сможете помочь реализовать бинарную перегрузку +. Сложить элементы матрицы в методе не проблема. Сложность: складывать надо через main создавая третий элемент куда будет происходить суммирование. Как это правильно описать?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.05.2016, 09:50
Ответы с готовыми решениями:

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

Перегрузка операторов
Задание такое-Составить описание класса для представления комплексных чисел. Обеспечить выполнение операций сложения, вычитания и умножения...

Перегрузка операторов
Доброй ночи! Изучаю перегрузку операторов. Создал класс Дробь, где в качестве данных выступают числитель и знаменатель дроби. ...

5
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
03.05.2016, 10:08
Лучший ответ Сообщение было отмечено IAlexey как решение

Решение

Ох, странное у вас сравнение какое-то...
Проверьте через Print, что матрицы действительно одинаковы. И переделайте функцию сравнения.

C++
1
2
3
4
5
6
7
bool Matrix::operator == (Matrix &rhs)
{
  for (int i = 0; i < n; i++)
       for (int j = 0; j < n; j++)
          if (A[i][j] != rhs.A[i][j]) return false;
  return true;
}
Добавлено через 10 минут
По поводу суммирования - в вашем случае можно так.
C++
1
2
3
4
5
6
7
8
9
Matrix Matrix::operator + (Matrix &rhs)
{
  Matrix ret;
  for (int i = 0; i < n; i++)
     for (int j = 0; j < n; j++)
         ret.A[i][j] = A[i][j] + rhs.A[i][j];
  ret.n = n;
  return ret;
}
1
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 15
03.05.2016, 10:44  [ТС]
Спасибо за ответ.
Странное сравнение из-за того, что матрицы не обязательно должны быть равны друг другу как матрицы, а просто суммы их элементов должны быть равны. Логика сравнения просто немного другая. Согласен с тем, что смело можно называть класс не матрицы, а квадратного массива. От матрицы только вычисление определителя у меня осталось.
Попробовал, как вы написали, на полное равенство. Все равно не получается.
Через print проверял, точно одинаковые. Притом не только суммы равны, а совсем одинаковые.
Может где-то в синтаксисе в main ошибка? Почему отладчик не переходит в файл методов и не пытается сравнивать, а сразу перескакивает на else?
По поводу суммирования. А как реализовать правильно в main, чтобы этот новый элемент попал в массив массивов под заданным номером Matrix
C++
1
**MatrixArray = new Matrix*[size];
?
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
03.05.2016, 11:18
А... Сообразил...
MatrixArray - это массив указателей.
а MatrixArray[element1] - это указатель. Вы указатели сравниваете, а не матрицы....

Добавлено через 52 секунды
То есть
*MatrixArray[0] == *MatrixArray[1]
Вот так надо.

Добавлено через 2 минуты
И вообще говоря, если вы используете new, то синтаксис массивов лучше не использовать и всё делать через указатели. Чтобы не путаться.
1
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 15
03.05.2016, 13:02  [ТС]
Большое спасибо! Сам бы еще долго думал, почему так происходит. Преподаватель как пример давал массив массивов, оттуда и вытянул. На будущее учту, что лучше не использовать массивы, а через указатели работать сразу.
А по поводу суммирования, если все-же пока что остается массив массивов,то как правильно реализовать в main, чтобы этот новый элемент попал в массив массивов под заданным номером.
Если в файле методов
C++
1
2
3
4
5
6
7
8
9
Matrix Matrix::operator + (Matrix &rhs)
{
  Matrix ret;
  for (int i = 0; i < n; i++)
     for (int j = 0; j < n; j++)
         ret.A[i][j] = A[i][j] + rhs.A[i][j];
  ret.n = n;
  return ret;
}
В main например
C++
1
2
3
4
5
**MatrixArray = new Matrix*[5];
MatrixArray[1] = new Matrix(); //в констр. по умолч. размер 2х2 и заполнена единицами
MatrixArray[2] = new Matrix();
//в нулевой элемент хочу поместить просуммированную матрица 1 и 2.
MatrixArray[0] = MatrixArray[1] + MatrixArray[2];
тут компилятор ругается на 5 строчку. Почему?
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
05.05.2016, 08:46
Может оператор присваивания надо определить?

Добавлено через 10 минут
И потом... Вы опять складываете указатели, а не матрицы...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.05.2016, 08:46
Помогаю со студенческими работами здесь

Перегрузка операторов
Вот задание b) Создать класс Set – множество целых чисел, используя динамическую память. Определить операторы работы с множествами:...

Перегрузка операторов
Никак не возьму в толк, почему оно не работает! // CG5.cpp : Defines the entry point for the console application. // #include...

C++ перегрузка операторов
люди такая ситуация кто может в краце объясните перегрузку операторов мне например надо перегрузить оператор умножения что бы умножить...

Перегрузка операторов
Ошибка: &quot;error: invalid operands to binary expression ('Number *' and 'Number *') n3 = n1 * n2;&quot; class Number { public: ...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru