Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/55: Рейтинг темы: голосов - 55, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 22
1

Перегрузка оператора сложения матриц

16.11.2016, 23:07. Показов 10830. Ответов 5
Метки нет (Все метки)

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
class DoubleArr
{
private:
    double** arr; // массив
    int h; // высота массива
    int w; // ширина массива
public:
    DoubleArr(int x = 0, int y = 0); // конструктор по умолчанию
    DoubleArr(double); // преобразование из double в матрицу с помощью конструктора
    void Show(); // вывод матрицы
    void Get(); // ввод матрицы
    operator double(); // преобразование из матрицы в double
    
    void operator= (const DoubleArr& D); //оператор присваивания - изменяет объект
    DoubleArr& operator+ (const DoubleArr& D) const; //оператор сложения - создает новый объект
    DoubleArr& operator- (const DoubleArr& D) const; //оператор вычитания - создает новый объект
    void operator+= (double); //оператор увеличивает все элементы матрицы на указанное значение
    bool operator> (const DoubleArr& D); //оператор сравнения
    bool operator< (const DoubleArr& D); //оператор сравнения
    bool operator>= (const DoubleArr& D); //оператор сравнения
    bool operator<= (const DoubleArr& D); //оператор сравнения
    bool operator!= (const DoubleArr& D); //оператор сравнения
    bool operator== (const DoubleArr& D); //оператор сравнения
    double* operator[] (int); //оператор доступа к элементу матрицы
 
    ~DoubleArr(); // деструктор
};
Перегружаю операторы = и +
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
DoubleArr& DoubleArr::operator+ (const DoubleArr& D) const
{
    if (w != D.w || h != D.h)
    {
        cout << "Сложение матриц невозможно!";
        exit(1);
    }
    DoubleArr A(h, w);
    for (int i = 0; i < w; i++)
        for (int j = 0; j < h; j++)
            A.arr[i][j] = arr[i][j] + D.arr[i][j];
    return A;
}
 
void DoubleArr::operator= (const DoubleArr& D)
{
    for (int i = 0; i < w; i++)
        delete[] arr[i];
    delete[] arr;
    w = D.w;
    h = D.h;
    arr = new double*[w]; 
    for (int i = 0; i < w; i++)
    {
        arr[i] = new double[h]; 
    }
    for (int i = 0; i < w; i++)
        for (int j = 0; j < h; j++)
            arr[i][j] = D.arr[i][j];
}
Main
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
#include "stdafx.h"
#include <iostream>
#include "DoubleArr.h"
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus"); // подключаем кириллицу
 
    DoubleArr A (3, 3);
    A.Get();
    A.Show();
    DoubleArr B;
    B = A;
    B.Show();
    DoubleArr C (3, 3);
    C = A + B;
    C.Show();
    
    cout << endl << "массив 1 [0][0] = " << A[0][0] << endl;
 
    system("pause");
    return 0;
}
В момент выполнения программы возникает ошибка в точке
C++
1
C = A + B;
По заданию, оператор + должен создавать новый объект

В чем может быть косяк?
Миниатюры
Перегрузка оператора сложения матриц  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2016, 23:07
Ответы с готовыми решениями:

Перегрузка оператора сложения
У меня есть класс, который содержит в себе строку и ее длину. Класс распределяет динамическую...

Перегрузка оператора сложения
Здравствуйте! Имеется такой код: class ClassA { public: ClassA() { m =...

Перегрузка оператора сложения
CComplexVector&amp; operator+ (const CComplexVector&amp; right) { CComplexVector* res = new...

Перегрузка оператора сложения
Некорректно выводит результат сложения- результат просто не записывается в конечную переменную....

5
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 22
18.11.2016, 00:14  [ТС] 2
Неужели никто не подскажет?

Добавлено через 1 час 43 минуты
Проблема нашлась, но что с ней делать пока непонятно..
По условиям задания "оператор + должен создавать новый объект", У меня в описании оператора создается новый объект DoubleArr A.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
DoubleArr& DoubleArr::operator+ (const DoubleArr& D) const
{
    if (w != D.w || h != D.h)
    {
        cout << "Сложение матриц невозможно!";
        exit(1);
    }
    DoubleArr A(h, w);
    for (int i = 0; i < w; i++)
        for (int j = 0; j < h; j++)
            A.arr[i][j] = arr[i][j] + D.arr[i][j];
    return A;
}
но после return A вызывается деструктор только что созданного объекта А и возвращаемый указатель ведет вникуда..
Как обойти это?

Добавлено через 3 часа 45 минут
Братцы, выручайте!
0
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
18.11.2016, 06:54 3
Покажи, как ты выделяешь память.
Конструктор копирования, остальные конструкторы.

Оператор присваивания с ошибкой
C++
1
    void operator= (const DoubleArr& D); //оператор присваивания - изменяет объект
Так надо
C++
1
    DoubleArr& operator= (const DoubleArr& D); //оператор присваивания - изменяет объект
0
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 22
19.11.2016, 00:09  [ТС] 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
24
25
26
27
28
29
30
31
32
33
34
35
36
DoubleArr::DoubleArr(int vys, int shir)
{
    h = vys;
    w = shir;
    arr = new double*[w]; //выделение памяти под строки массива
    for (int i = 0; i < w; i++)
    {
        arr[i] = new double[h]; //выделение памяти под столбцы массива
    }
}
 
DoubleArr::DoubleArr(double x) // преобразование из double в матрицу с помощью конструктора
{
    h = 1;
    w = 1;
    arr = new double*[w]; //выделение памяти под строки массива
    for (int i = 0; i < w; i++)
    {
        arr[i] = new double[h]; //выделение памяти под столбцы массива
    }
    arr[0][0] = x;
}
 
DoubleArr::DoubleArr(const DoubleArr &X)
{
    h = X.h;
    w = X.w;
    arr = new double*[w]; //выделение памяти под строки массива
    for (int i = 0; i < w; i++)
    {
        arr[i] = new double[h]; //выделение памяти под столбцы массива
    }
    for (int i = 0; i < w; i++)
        for (int j = 0; j < h; j++)
            arr[i][j] = X.arr[i][j];
}


Цитата Сообщение от Kant Посмотреть сообщение
Так надо
C++Выделить код
1
* * DoubleArr& operator= (const DoubleArr& D); //оператор присваивания - изменяет объект
Спасибо за замечание - поправил.

Добавлено через 21 секунду
Проблема актуальна...
0
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
19.11.2016, 02:43 5
Почитай про перегрузку операторов в своем учебнике или тут.

Добавлено через 8 минут
Вот смотри, каким должен быть твой класс Матрица в жизни.

Добавлено через 11 минут
Убери ссылку в operator+

C++
1
2
3
4
DoubleArr& DoubleArr::operator+ (const DoubleArr& D) const;
 
// на
DoubleArr DoubleArr::operator+ (const DoubleArr& D) const;
Покажи весь класс. У тебя вряд ли работает оператор индексирования, как следует.

Добавлено через 45 минут
Присмотрелся к Матрице, которую тебе скинул, а потом и в описании увидел.
Это не динамическая Матрица, то есть там не выделяется память в куче (
C++
1
arr = new double*[w];
), как у тебя.

То есть для очень больших размеров она, наверное, не подходит.
1
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 22
19.11.2016, 11:32  [ТС] 6
Спасибо, Kant.
Удаление ссылки в operator+ помогло.
0
19.11.2016, 11:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2016, 11:32
Помогаю со студенческими работами здесь

Перегрузка оператора сложения
Добрый день. Есть вот эта перегрузка оператора сложения для класса многочлена. Polynom...

Перегрузка оператора сложения
Ребята пожалуйста помогите!!!) Не получается прописать перегрузку оператора сложения в следующем...

Перегрузка оператора сложения
оч надо лабу срочно написать помогите плиз... Разработать программу с демонстрацией механизма...

Перегрузка оператора сложения. (Сложение массивов)
Задание целиком: /* Создать класс Динамический массив. Класс должен содержать • конструкторы...


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

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