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

перегрузить оператор ++ - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
сержи
6 / 6 / 0
Регистрация: 03.07.2010
Сообщений: 222
25.04.2012, 18:03     перегрузить оператор ++ #1
Всем привет!!!Тут такое дело, когда запускаю программу она запускается, а когда дело доходит до перегрузки она выдает ошибку((: То есть закрывает ее.
--
Хотел спросить как это исправить?
Вот код программы:
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
#include <stdio.h>
#include <conio.h>
 
using namespace std;
 
class Size
{
    int column;
    int row;
    public:
    Size()
    {
        column = 1;
        row = 1;
    }
    Size(int i, int j)
    {
        column = i;
        row = j;
    }
    void set(int i, int j)
    {
        column = i;
        row = j;
    }
    int get_column()
    {
        return column;
    }
    int get_row()
    {
        return row;
    }
};
 
class Matrix
{
    Size sz;
    int **values;
    void init_matrix(int value = 0)
    {
        try
        {
            values = new int*[sz.get_row()];
        }
        catch(bad_alloc xa)
        {
            exit(1);
        }
        for(int i = 0; i < sz.get_row(); i++)
        {
            try
            {
                values[i] = new int[sz.get_column()];
            }
            catch(bad_alloc xa)
            {
                exit(1);
            }
        }
        for(int i = 0; i < sz.get_row(); i++)
        {
            for(int j = 0; j < sz.get_column(); j++)
            {
                values[i][j] = value;
            }
        }
    }
    public:
    Matrix()
    {
        sz = Size();
        init_matrix();
    }
    Matrix(Size s, int value)
    {
        sz = s;
        init_matrix(value);
    }
    ~Matrix()
    {
        delete [] values;
    }
    int get_rows()
    {
        return sz.get_row();
    }
    int get_columns()
    {
        return sz.get_column();
    }
    int get_value(int i, int j)
    {
        if(i < 0 || i >= sz.get_row()) return 0;
        if(j < 0 || j >= sz.get_column()) return 0;
        return values[i][j];
    }
    Matrix operator++()
    {
        for(int i = 0; i < sz.get_row(); i++)
        {
            for(int j = 0; j < sz.get_column(); j++)
            {
                values[i][j]++;
            }
        }
        return *this;
    }
};
 
int main(int argc, char *argv[])
{
    cout << "Demo\n";
    Size sz(5, 5);
    Matrix m(sz, 2);
    for(int i = 0; i < sz.get_row(); i++)
    {
        for(int j = 0; j < sz.get_column(); j++)
        {
            cout << m.get_value(i, j)
                 << "\t";
        }
        cout << endl;
    }
    ++m;
    cout << "----------------------------------------\n";
    for(int i = 0; i < sz.get_row(); i++)
    {
        for(int j = 0; j < sz.get_column(); j++)
        {
            cout << m.get_value(i, j)
                 << "\t";
        }
        cout << endl;
    }
    system("pause");
    return 0;
}
Вот само условие:
Создать класс Matrix, содержащий следующие элементы:
- поле «размер» Size s;
- поле «данные» int Data[s.Raw,s.Column];
- метод получения кол-ва строк int GetRaw();
- метод получения кол-ва столбцов int GetColumn();
- метод получения значения ячейки int GetValue(int i, int j)
- конструктор с параметрами Matrix(Size s, int InitialValue);
Создать класс Size, содержащий элементы:
- поле «кол-во строк» int Raw;
- поле «кол-во столбцов» int Column;
- конструктор с параметрами Size(int Raw, int Column );
В классе Matrix перегрузить оператор ++ перемножение матриц.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,910
Записей в блоге: 1
25.04.2012, 18:11     перегрузить оператор ++ #2
А оператор присвоения и конструктор копирования кот перегружать будет?
Это обязательно для всех классов, хранящих динамически выделенную память
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5665 / 3144 / 356
Регистрация: 29.11.2010
Сообщений: 8,420
25.04.2012, 18:14     перегрузить оператор ++ #3
да, и про описание деструктора не забудьте
сержи
6 / 6 / 0
Регистрация: 03.07.2010
Сообщений: 222
25.04.2012, 18:18  [ТС]     перегрузить оператор ++ #4
Ыыы!!!
Не совсем понял вас!!
thick_int
Заблокирован
25.04.2012, 18:33     перегрузить оператор ++ #5
Запомните хорошенько, что перегруженный префиксный оператор инкремента (и декремента) должен возвращать ССЫЛКУ НА объект, на который он действует, поэтому после Matrix поставь амперсанд.
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,910
Записей в блоге: 1
25.04.2012, 18:34     перегрузить оператор ++ #6
в Matrix не хватает
C++
1
2
Matrix(Matrix&);
Matrix& operator = (Matrix&)
сержи
6 / 6 / 0
Регистрация: 03.07.2010
Сообщений: 222
25.04.2012, 18:45  [ТС]     перегрузить оператор ++ #7
Это получается после 71 строчки вписать
C++
1
2
Matrix(Matrix&);
Matrix& operator = (Matrix&)
?
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,910
Записей в блоге: 1
25.04.2012, 18:50     перегрузить оператор ++ #8
не только вписать, но и реализовать копирование для каждого случая.
Понимаешь, конструктор копирования по умолчанию копирует непосредственно поля класса
то есть при копировании у двух классов указатели values будут указывать на одно и то же место.
Хуже того, для того временного объекта, из которого ты скопировал данные может быть вызван деструктор(например после выхода из функции), который очистит вашу общую память и будет очень плохо это
сержи
6 / 6 / 0
Регистрация: 03.07.2010
Сообщений: 222
25.04.2012, 18:54  [ТС]     перегрузить оператор ++ #9
мх!!
А не могли бы вы помочь в этом((..
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,910
Записей в блоге: 1
25.04.2012, 19:04     перегрузить оператор ++ #10
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
Matrix(const Matrix& copy){
 sz = copy.sz;
    try
        {
            values = new int*[sz.get_row()];
        }
        catch(bad_alloc xa)
        {
            exit(1);
        }
        for(int i = 0; i < sz.get_row(); i++)
        {
            try
            {
                values[i] = new int[sz.get_column()];
            }
            catch(bad_alloc xa)
            {
                exit(1);
            }           
            for(int j = 0; j < sz.get_column(); j++)
            {
                values[i][j] = copy. values[i][j] ;
            }
        }
}
Matrix& operator = (const Matrix& Copy){
 if (&Copy==this) return *this;    
     for(int i = 0; i < sz.get_row(); i++)
         delete[] values[i]; 
         delete[] values;
     sz = copy.sz;
    try
        {
            values = new int*[sz.get_row()];
        }
        catch(bad_alloc xa)
        {
            exit(1);
        }
        for(int i = 0; i < sz.get_row(); i++)
        {
            try
            {
                values[i] = new int[sz.get_column()];
            }
            catch(bad_alloc xa)
            {
                exit(1);
            }
            for(int j = 0; j < sz.get_column(); j++)
            {
                values[i][j] = copy. values[i][j] ;
            }
        }
return *this;
}
готово
сержи
6 / 6 / 0
Регистрация: 03.07.2010
Сообщений: 222
25.04.2012, 22:12  [ТС]     перегрузить оператор ++ #11
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <iostream>
#include <stdio.h>
#include <conio.h>
 
using namespace std;
 
class Size
{
    int column;
    int row;
    public:
    Size()
    {
        column = 1;
        row = 1;
    }
    Size(int i, int j)
    {
        column = i;
        row = j;
    }
    void set(int i, int j)
    {
        column = i;
        row = j;
    }
    int get_column()
    {
        return column;
    }
    int get_row()
    {
        return row;
    }
};
 
class Matrix
{
    Size sz;
    int **values;
    void init_matrix(int value = 0)
    {
        try
        {
            values = new int*[sz.get_row()];
        }
        catch(bad_alloc xa)
        {
            exit(1);
        }
        for(int i = 0; i < sz.get_row(); i++)
        {
            try
            {
                values[i] = new int[sz.get_column()];
            }
            catch(bad_alloc xa)
            {
                exit(1);
            }
        }
        for(i = 0; i < sz.get_row(); i++)
        {
            for(int j = 0; j < sz.get_column(); j++)
            {
                values[i][j] = value;
            }
        }
    }
    public:
Matrix(const Matrix& copy){
 sz = copy.sz;
    try
        {
            values = new int*[sz.get_row()];
        }
        catch(bad_alloc xa)
        {
            exit(1);
        }
        for(int i = 0; i < sz.get_row(); i++)
        {
            try
            {
                values[i] = new int[sz.get_column()];
            }
            catch(bad_alloc xa)
            {
                exit(1);
            }           
            for(int j = 0; j < sz.get_column(); j++)
            {
                values[i][j] = copy. values[i][j] ;
            }
        }
}
Matrix& operator = (const Matrix& Copy){
 if (&Copy==this) return *this;    
     for(int i = 0; i < sz.get_row(); i++)
         delete[] values[i]; 
         delete[] values;
     sz = copy.sz;
    try
        {
            values = new int*[sz.get_row()];
        }
        catch(bad_alloc xa)
        {
            exit(1);
        }
        for(int i = 0; i < sz.get_row(); i++)
        {
            try
            {
                values[i] = new int[sz.get_column()];
            }
            catch(bad_alloc xa)
            {
                exit(1);
            }
            for(int j = 0; j < sz.get_column(); j++)
            {
                values[i][j] = copy. values[i][j] ;
            }
        }
return *this;
}
 
int main(int argc, char *argv[])
{
    cout << "Demo\n";
    Size sz(5, 5);
    Matrix m(sz, 2);
    for(int i = 0; i < sz.get_row(); i++)
    {
        for(int j = 0; j < sz.get_column(); j++)
        {
            cout << m.get_value(i, j)
                 << "\t";
        }
        cout << endl;
    }
    ++m;
    cout << "----------------------------------------\n";
    for(i = 0; i < sz.get_row(); i++)
    {
        for(int j = 0; j < sz.get_column(); j++)
        {
            cout << m.get_value(i, j)
                 << "\t";
        }
        cout << endl;
    }
    system("pause");
    return 0;
}
Вроде все правильно вставил, но выдает следующий error:
c:\program files (x86)\microsoft visual studio\myprojects\sqw\sqe.cpp(157) : fatal error C1004: unexpected end of file found
Error executing cl.exe.

Подскажите в чем ошибка?
Просто раньше когда была такая ошибка, помогало создание нового проекта, а щас даже это не помогает((
thick_int
Заблокирован
25.04.2012, 22:20     перегрузить оператор ++ #12
В 127 строке точка с запятой пропущена.
сержи
6 / 6 / 0
Регистрация: 03.07.2010
Сообщений: 222
25.04.2012, 22:25  [ТС]     перегрузить оператор ++ #13
Ставлю ;
в 127 строке:

Цитата Сообщение от сержи Посмотреть сообщение
return *this;
};
Все равно error((
Может сам С++ глючит?
thick_int
Заблокирован
25.04.2012, 22:31     перегрузить оператор ++ #14
А какой теперь Error?
сержи
6 / 6 / 0
Регистрация: 03.07.2010
Сообщений: 222
25.04.2012, 22:50  [ТС]     перегрузить оператор ++ #15
Цитата Сообщение от thick_int Посмотреть сообщение
А какой теперь Error?
Такой же error((
Щас попробую на нетбуке запустить ее!!!

Добавлено через 14 минут
Help Help
thick_int
Заблокирован
25.04.2012, 23:02     перегрузить оператор ++ #16
Ошибка эта, как правило связана с тем, что где-то забыта скобка или точка с запятой.
Начинайте комментит свой код, а затем раскоменчивать.
Так и выйдете на ошибку.
сержи
6 / 6 / 0
Регистрация: 03.07.2010
Сообщений: 222
25.04.2012, 23:06  [ТС]     перегрузить оператор ++ #17
Цитата Сообщение от thick_int Посмотреть сообщение
Ошибка эта, как правило связана с тем, что где-то забыта скобка или точка с запятой.
Начинайте комментит свой код, а затем раскоменчивать.
Так и выйдете на ошибку.
Дело в том что, код запускался потом в Windows XP, там вообще 7 ошибок нашло((
А у меня на семерке ток эта 1 единственная ошибка(
---
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
25.04.2012, 23:11     перегрузить оператор ++ #18
Цитата Сообщение от thick_int Посмотреть сообщение
Ошибка эта, как правило связана с тем, что где-то забыта скобка или точка с запятой.
Начинайте комментит свой код, а затем раскоменчивать.
Так и выйдете на ошибку.
А можете поподробнее про этот способ рассказать? А то бывает забуду где-нибудь точку с запятой поставить, а компилятор выдаёт мне ошибку в совершенно другом файле...
сержи
6 / 6 / 0
Регистрация: 03.07.2010
Сообщений: 222
26.04.2012, 00:36  [ТС]     перегрузить оператор ++ #19
Help Help
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2012, 00:43     перегрузить оператор ++
Еще ссылки по теме:

C++ Перегрузить оператор -
Ofstream перегрузить оператор << C++
Перегрузить оператор C++
Перегрузить оператор доступа по индексу C++
Перегрузить оператор (true) C++

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

Или воспользуйтесь поиском по форуму:
thick_int
Заблокирован
26.04.2012, 00:43     перегрузить оператор ++ #20
Нет ну чем тут можно помочь. Начинайте коментировать свой код, а затем потихонечку раскоментировать.
Другого способа нет.
Yandex
Объявления
26.04.2012, 00:43     перегрузить оператор ++
Ответ Создать тему
Опции темы

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