Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 6
1

Перегруженный оператор ввода

09.08.2019, 23:24. Показов 921. Ответов 1
Метки нет (Все метки)

Почему ошибка при попытке вывести результат сложения двух матриц?

C++ (Qt)
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <iostream>
 
using namespace std;
 
class Matrix
{
private:
    int rows_; //строка
    int cols_; //столбец
    int** ptr_;
public:
    Matrix(): rows_(0), cols_(0) {}
    Matrix(int num_rows, int num_cols): rows_(num_rows), cols_(num_cols) {}
    void Reset(int num_rows, int num_cols)
    {
        if (num_rows < 0 || num_cols < 0)
            throw out_of_range("Wrong value");
        else
        {
            rows_ = num_rows;
            cols_ = num_cols;
        }
    }
 
    void FilltheMatrix()
    {
        if (rows_ != 0 && cols_ != 0)
        {
            ptr_ = new int* [rows_];
            for (auto i = 1; i <= rows_; ++i)
            {
                ptr_[i] = new int [cols_];
            }
            for (auto i = 1; i <= rows_; ++i)
            {
                for (auto j = 1; j <= cols_; ++j)
                    cin >> ptr_[i][j];
            }
        }
    }
 
    int At(int row, int col) const {return ptr_[row][col];}
 
    int& At(int row, int col) {return ptr_[row][col];}
 
    int GetNumRows() const {return rows_;}
    int GetNumCols() const {return cols_;}
    friend istream& operator>>(istream& in, Matrix& matrix);
    friend ostream& operator<<(ostream& os, Matrix& matrix);
    friend bool operator==(const Matrix& lhs, const Matrix& rhs);
    friend Matrix operator+(const Matrix& lhs, const Matrix& rhs);
};
 
istream& operator>>(istream &in, Matrix& matrix)
{
    in >> matrix.rows_;
    in >> matrix.cols_;
    if (matrix.rows_ != 0 && matrix.cols_ != 0)
    {
        matrix.ptr_ = new int* [matrix.rows_];
        for (auto i = 1; i <= matrix.rows_; ++i)
        {
            matrix.ptr_[i] = new int [matrix.cols_];
        }
        for (auto i = 1; i <= matrix.rows_; ++i)
        {
            for (auto j = 1; j <= matrix.cols_; ++j)
                in >> matrix.ptr_[i][j];
        }
    }
    return in;
 
}
ostream& operator<<(ostream& os, Matrix& matrix)
{
    os << matrix.rows_ << "   " << matrix.cols_ << endl;
    for (auto i = 1; i <= matrix.rows_; ++i)
    {
        for (auto j = 1; j <= matrix.cols_; ++j)
        {
            os << matrix.ptr_[i][j] << "  ";
        }
        os << endl;
    }
    return os;
}
 
bool operator==(const Matrix& lhs, const Matrix& rhs)
{
    bool check = false;
    if (rhs.rows_ == lhs.rows_ == rhs.cols_ == lhs.cols_ == 0)
        return true;
    if (lhs.rows_ != rhs.rows_ || lhs.cols_ != rhs.cols_)
        return false;
    else
        for (auto i = 1; i <= lhs.rows_; ++i)
        {
            for (auto j = 1; j <= lhs.cols_; ++j)
            {
                if (lhs.ptr_[i][j] == rhs.ptr_[i][j])
                {
                    check = true;
                }
                else return false;
            }
        }
    return check;
}
 
Matrix operator+(const Matrix& lhs, const Matrix& rhs)
{
    if (rhs.rows_ == lhs.rows_ == rhs.cols_ == lhs.cols_ == 0)
    {
        Matrix result;
        return result;
    }
    if (lhs.rows_ != rhs.rows_ || lhs.cols_ != rhs.cols_)
        throw invalid_argument("Wrong value");
    else
    {
        Matrix result(lhs.rows_, lhs.cols_);
        for (auto i = 1; i <= lhs.rows_; ++i)
        {
            result.ptr_[i] = new int [lhs.cols_];
        }
        for (auto i = 1; i <= lhs.rows_; ++i)
        {
            for (auto j = 1; j <= lhs.cols_; ++j)
                result.ptr_[i][j] = lhs.ptr_[i][j] + rhs.ptr_[i][j];
        }
        return result;
    }
}
 
int main()
{
    Matrix one;
    Matrix two;
    cin >> one;
    cout << one;
    
    cout << one + two << endl;
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2019, 23:24
Ответы с готовыми решениями:

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

Перегруженный оператор ввода/вывода для struct
Доброго времени суток, форумчане! У меня возник вопрос с перегрузкой оператора ввода на с++...

Перегруженный оператор
MathClass = Harry; Раньше я думал, что перегрузка - это предоставление оператору функций,...

Перегруженный оператор +
Товарищи программисты не могу понять вот этот кусок кода: dist4 = dist1 + dist2 + dist3; у нас...

1
221 / 148 / 79
Регистрация: 14.03.2016
Сообщений: 459
10.08.2019, 00:52 2
Лучший ответ Сообщение было отмечено EnjoyTheSilence как решение

Решение

В результате сложения образуется временный объект, который можно передать либо переместив его (используется оператор &&), либо передав по константной ссылке, но никак не по обычной.

C++
1
2
friend ostream& operator<<(ostream& os, Matrix&& matrix); //перемещение объекта 
friend ostream& operator<<(ostream& os, const Matrix& matrix); //передача по константной ссылке
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.08.2019, 00:52

Перегруженный оператор +
Здравствуйте. Нужно разобраться как работает перегруз операторов. Я взял оператор + и пытаюсь...

перегруженный оператор <<
подскажите как перегрузить оператор &lt;&lt; для класса как описать само перегружение friend ostream&amp;...

Функции и перегруженный оператор
Помогите реализовать на С++: 1.Определить пользовательский тип данных fraction (дробь),...

Функтор и перегруженный оператор
захотел понять многопоточность в новом стадарте с++11 - смотрю...


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

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

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