Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
stv
26 / 26 / 6
Регистрация: 05.03.2010
Сообщений: 171
#1

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

18.05.2010, 18:21. Просмотров 354. Ответов 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". Помогите, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2010, 18:21     После перегрузки операторов не работает cout
Посмотрите здесь:

C++ Не работает Cout
cout не работает C++
С помощью перегрузки операторов складывать, вычитать натуральные дроби C++
Разработка алгоритмов и программ по реализации перегрузки операторов C++
C++ Не работает перегрузка операторов при выводе в cout
Перегрузка операторов cout and cin C++
Дружественные перегрузки операторов и дружественные классы C++
C++ Использование перегрузки операторов для комплексного числа
C++ Перестала работать программа после добавления перегрузки
Cout не работает после вызова метода append C++
C++ Использование функций-членов для перегрузки унарных операторов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
18.05.2010, 18:37     После перегрузки операторов не работает cout #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)
stv
26 / 26 / 6
Регистрация: 05.03.2010
Сообщений: 171
18.05.2010, 19:20  [ТС]     После перегрузки операторов не работает cout #3
Спасибо большое

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

Добавлено через 5 минут
Если завести третью переменную и возвращать ее, то амперсант перед operator не надо?
Genius Ignat
1234 / 772 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
18.05.2010, 21:07     После перегрузки операторов не работает cout #4
Может пригодиться:
Класс Матрица
Yandex
Объявления
18.05.2010, 21:07     После перегрузки операторов не работает cout
Ответ Создать тему
Опции темы

Текущее время: 01:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru