26 / 26 / 3
Регистрация: 05.03.2010
Сообщений: 170
1

После перегрузки операторов не работает cout

18.05.2010, 18:21. Показов 730. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. После использования перегруженного оператора + перестает работать оператор вывода. Почему такое возможно? Или у меня ошибка?
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
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
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
 
class Matrix
{
    private:
        long int **Matr;
        long int row;
        long int col;
 
        void Create()
        {
            Matr = new long int*[row];
            for (int i=0; i < row; i++)
                Matr[i] = new long int[col];
        }
 
    public:
        // constructors and destructor
        Matrix(): row(5), col(5) { Create();}
        Matrix(long int i): row(i), col(i) { Create(); }
        Matrix(long int i, long int j): row(i), col(j) { Create(); }
        ~Matrix()
        {
            for (int i=0; i < col; i++)
                delete[] Matr[i];
            delete[] Matr;
        }
 
        // methods
        long int& element(long int i, long int j)
        {
            if (i < row && j < col)
                return Matr[i][j];
            else
                cout << "Error: 1";
        }
 
        void MultiplyBy(long int x)
        {
            for(int i=0; i<row; i++)
                for(int j=0; j<col; j++)
                    Matr[i][j] *= x;
        }
 
        void Display()
        {
            for(int i=0; i<row; i++)
            {
                for(int j=0; j<col; j++)
                {
                    cout.width(4);
                    cout << Matr[i][j];
                }
                cout << endl;
            }
        }
        void SetRandom()
        {
            srand(time(NULL));
            for(int i=0; i < row; i++)
            for(int j=0; j < col; j++)
                Matr[i][j] = rand() % 1000;
        }
        
        Matrix operator+ (Matrix &m)
        {
            if (m.row != row || m.col != col) 
            {
                cout << "Error! operator + \n";
                return (*this);
            }
 
            for(int i=0; i < m.row; i++)
            for(int j=0; j < m.col; j++)
                (*this).element(i,j) += m.element(i, j);
            return (*this);
        }
        Matrix operator- (Matrix &m)
        {
            if (m.row != row || m.col != col) 
            {
                cout << "Error! operator + \n";
                return (*this);
            }
 
            for(int i=0; i < m.row; i++)
            for(int j=0; j < m.col; j++)
                (*this).element(i,j) -= m.element(i, j);
            return (*this);
        }   
        Matrix operator= (Matrix &m)
        {
            if (m.row != row || m.col != col) 
            {
                cout << "Error! operator + \n";
                return (*this);
            }
            for(int i=0; i < m.row; i++)
            for(int j=0; j < m.col; j++)
                (*this).element(i,j) = m.element(i, j);
            return (*this);
        }
};
 
 
 
int main()
{
    Matrix a(5), b(5), c(5);
    a.SetRandom();
    b.SetRandom();
    a.Display();
    cout << endl;
    b.Display();
    cout << "test" << endl;
    c = a + b;
    c.Display();
    return 0;
}
Последнее, что выводится на экране - "test". Помогите, пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2010, 18:21
Ответы с готовыми решениями:

Не работает перегрузка операторов при выводе в cout
написал свой класс ComplexNumber. перегрузил для него операторы +, -, *, /, &lt;&lt;. конструкции вида ...

Не работает сетевой мост после перегрузки
Есть 1ПК на Windows XP SP3 внем две сетевых карты 1 сетевуха стоит получать автоматически IP адрес...

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

Cout не работает после вызова метода append
#include &lt;iostream&gt; #include &lt;cstddef&gt; // size_t #include &lt;cstring&gt; // strlen, strcpy using...

3
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
18.05.2010, 18:37 2
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
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
 
class Matrix
{
    private:
        long int **Matr;
        long int row;
        long int col;
        long int nError;
 
        void Create()
        {
            Matr = new long int*[row];
            for (int i=0; i < row; i++)
                Matr[i] = new long int[col];
        }
 
    public:
        // constructors and destructor
        Matrix(): row(5), col(5), nError(-100500) { Create();}
        Matrix(long int i): row(i), col(i) { Create(); }
        Matrix(long int i, long int j): row(i), col(j) { Create(); }
        ~Matrix()
        {
            for (int i=0; i < col; i++)
                delete[] Matr[i];
            delete[] Matr;
        }
 
        // methods
        long int& element(long int i, long int j)
        {
            if (i < row && j < col)
                return Matr[i][j];
            else
                cout << "Error: 1";
            return nError;
        }
 
        void MultiplyBy(long int x)
        {
            for(int i=0; i<row; i++)
                for(int j=0; j<col; j++)
                    Matr[i][j] *= x;
        }
 
        void Display()
        {
            for(int i=0; i<row; i++)
            {
                for(int j=0; j<col; j++)
                {
                    cout.width(4);
                    cout << Matr[i][j];
                }
                cout << endl;
            }
        }
                void SetRandom()
                {
                        srand(time(NULL));
                        for(int i=0; i < row; i++)
                        for(int j=0; j < col; j++)
                                Matr[i][j] = rand() % 1000;
                }
                
                Matrix& operator+ (Matrix &m)
                {
                        if (m.row != row || m.col != col) 
                        {
                                cout << "Error! operator + \n";
                                return (*this);
                        }
 
                        for(int i=0; i < m.row; i++)
                        for(int j=0; j < m.col; j++)
                                (*this).element(i,j) += m.element(i, j);
                        return (*this);
                }
                Matrix& operator- (Matrix &m)
                {
                        if (m.row != row || m.col != col) 
                        {
                                cout << "Error! operator + \n";
                                return (*this);
                        }
 
                        for(int i=0; i < m.row; i++)
                        for(int j=0; j < m.col; j++)
                                (*this).element(i,j) -= m.element(i, j);
                        return (*this);
                }       
                Matrix& operator= (Matrix &m)
                {
                        if (m.row != row || m.col != col) 
                        {
                                cout << "Error! operator + \n";
                                return (*this);
                        }
                        for(int i=0; i < m.row; i++)
                        for(int j=0; j < m.col; j++)
                                (*this).element(i,j) = m.element(i, j);
                        return (*this);
                }
};
 
 
 
int main()
{
        Matrix a(5), b(5), c(5);
        a.SetRandom();
        b.SetRandom();
        a.Display();
        cout << endl;
        b.Display();
        cout << "test" << endl;
        c = a + b;
        c.Display();
    return 0;
}
когда вы возвращаете return (*this); вы можете:
1)вернуть ссылку на себя (те например результатом Matrix& operator+(Matrix &m) будет сам объект)
2)вернуть свою копию (Matrix operator+(Matrix &m)), те возвращаем копию, и на ее основе конструируем новый объект, однако для этого надо реализовать конструктор копий вида Matrix(const Matrix &m)
1
26 / 26 / 3
Регистрация: 05.03.2010
Сообщений: 170
18.05.2010, 19:20  [ТС] 3
Спасибо большое

Добавлено через 1 минуту
Цитата Сообщение от alex_x_x Посмотреть сообщение
конструктор копий вида Matrix(const Matrix &m)
Конструктор-копировщик?

Добавлено через 5 минут
Если завести третью переменную и возвращать ее, то амперсант перед operator не надо?
0
1260 / 798 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
18.05.2010, 21:07 4
Может пригодиться:
Класс Матрица
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.05.2010, 21:07
Помогаю со студенческими работами здесь

Объявление перегрузки операторов
Здравствуйте! Трабл заключается в том, что не получается объявить операторы за пределами своего...

Каково назначение перегрузки операторов
В Шилдте дается не совсем понятное определение перегрузке операторов. Как я понял, основное...

Особенности перегрузки некоторых операторов
У меня есть два вопроса насчёт перегрузки операторов. 1. Есть префиксные операторы ++ и -- и...

Изучение возможности перегрузки операторов в С++
Изучение возможности перегрузки операторов в С++.


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru