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

Класс для работы с матрицами - Что дает перегруженный оператор индексирования? - C++

Восстановить пароль Регистрация
 
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
07.04.2013, 01:15     Класс для работы с матрицами - Что дает перегруженный оператор индексирования? #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
#include <iostream>
#include <stdlib.h>
using namespace std;
 
class Matrix
{
private:
    int row, col;
//  static int numb;
    int ** IntData;
public:
    friend Matrix operator+ (const Matrix& l, const Matrix& r);
    Matrix(int _row, int _col): row(_row), col(_col) // конструктор c параметрами
    {
//      numb++;
        IntData = new int*[row];
        for (int i = 0; i < row; i++){
            IntData[i] = new int[col];
                 for (int j = 0; j < col; j++){
                     IntData[i][j] = rand();
                 }
             }
    }
    Matrix(const Matrix& m) // конструктор копирования
        {
        if (row != m.row || col != m.col)
        {
            for(int i = 0; i < row; ++i)
            delete [] IntData[i];
            delete [] IntData;
            row = m.row;
            col = m.col;
            IntData = new int*[row];
            for(int i = 0; i < row; ++i)
                IntData[i] = new int[col];
        }
        for (int i = 0; i < row; ++i)
            for (int j = 0; j < col; ++j)
                IntData[i][j] = m.IntData[i][j];
//      numb++;
        };
 
    ~Matrix()
    {for (int i = 0; i < row; i++){
        delete IntData[i];
        delete IntData;
//      numb--;
        }
    }
 
/*  void Fill()
    {
        cout << "\nNumber of rows: " ;
        cin >> row ;
        cout << "\nNumber of columns: " ;
        cin >> col ;
        cout << endl;
        for (int i = 0; i < row; i++){
             for (int j = 0; j < col; j++){
                 cout << "x[" << i << "][" << j << "]= ";
                 cin >> IntData[i][j];
             }}
    }
*/
 
    void Display()
    {
         cout << "\n Matrix \n";
         for (int i = 0; i < row; i++){
             cout << "\nRow: " << i << " >";        // нумеруем каждый ряд
             for (int j = 0; j < col; j++){
                 cout << " " << IntData[i][j]; // печатаем колонки
             }
         }
         return;
    }
 
        void SubMatrix()
        {
            int x, y, n, m;
            cout << "\nStart element [x][y]" << "\nx = ";
            cin >> x;
            cout << "y = ";
            cin >> y;
            cout << "Submatrix rows = ";
            cin >> m;
            cout << "Submatrix columns = ";
            cin >> n;
                 cout << "\n SubMatrix \n";
                 for (int i = x; i < m + x; i++){
                     cout << "\nRow: " << i << " >";
                     for (int j = y; j < n + y; j++){
                         cout << " " << IntData[i][j];
                     }
                 }
                 return;
        }
 
        int* operator[](int elem)
        {
            return IntData[elem];
        }
 
    /*  Matrix operator++ ()
        {
            col++;
            row++;
            return *this;
        } */
 
//      Matrix& operator=(const Matrix&){} ? не менять счетчик numb для присваивния
 
};
 
        Matrix operator+ (const Matrix& l, const Matrix& r)
        {
            if (l.col != r.col || l.row != r.row)
            cout << "wrong matrix size";
            Matrix result(l.row, l.col);
            for (int i = 0; i < l.row; ++i)
            for (int j = 0; j < l.col; ++j)
                result.IntData[i][j] = l.IntData[i][j] + r.IntData[i][j];
            return result;
        };
 
int main()
{
    Matrix m1(4, 5);
    m1.Display();
    Matrix m2(4, 5);
    m2.Display();
    Matrix m3 = m1 + m2;
    m3.Display();
    m3.SubMatrix();
 
    system("pause");
    return(0);
}


Вопросы и проблемы:
1. Что вообще дает перегруженный оператор индексирования? Он правильно написан? Писал просто по примерам.
2. Не получается сделать перегруженный оператор инкремента, который добавлял бы 1 строку и 1 столбец (пример попытки есть в коде в виде комментария).
3. Счетчик количества созданных объектов класса (переменная numb, тоже оставил в виде комментариев, выдает ошибку).
4. Методы вывода матрицы и подматрицы должны быть описаны в дружественном классе (у меня в основном). Когда выношу их в дружественный, они не видят переменных, хотя дружественный класс в основном прописывал.
5. Метод для ввода матрицы с клавиатуры Fill() подвешивает комп, если не хотите перезагружаться - не компилируйте его) Он мне в принципе и не нужен, но просто любобытно в чем там дело.
Может будут просто какие-то замечания по поводу реализации (более эффективные методы и т.п.).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2013, 01:15     Класс для работы с матрицами - Что дает перегруженный оператор индексирования?
Посмотрите здесь:

C++ Что за перегруженный оператор char* ()?
Класс для работы с матрицами 2х2 C++
C++ Создать динамический класс для работы с матрицами
Класс для работы с матрицами C++
Класс для работы с матрицами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.04.2013, 13:33     Класс для работы с матрицами - Что дает перегруженный оператор индексирования? #2
EvengarS, по-моему, на форуме достаточно тем, которые расжевывают подобные классы.
P.S. деструктор реализован не правильно: удалять массив надо через delete [] ptr.
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
07.04.2013, 14:01  [ТС]     Класс для работы с матрицами - Что дает перегруженный оператор индексирования? #3
То, что нашел - реализовал, что не реализовал - не нашел или не получается. Не подскажете где смотреть?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.04.2013, 14:09     Класс для работы с матрицами - Что дает перегруженный оператор индексирования? #4
EvengarS, такой поиск делали ?
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
07.04.2013, 19:35  [ТС]     Класс для работы с матрицами - Что дает перегруженный оператор индексирования? #5
Конечно делал, ни в одном примере не нашел операций, которые бы увеличивали количество строк и столбцов.
Счетчик объектов сделал как нашел - почему-то не работает.
Проблемы 2, 3 реализованы в коде, 4 не отображал, чтобы код оставался работающим.
Примеры и учебники мне уже не помогали, поэтому обратился за помощью.

Добавлено через 1 час 52 минуты
Попробовал написать инкремент так:

C++
1
2
3
4
5
6
    Matrix operator++(Matrix& x) // префиксная
        {
            ++x.col;
            ++x.row;
            return x;
        };
Гворит - increment of member in read-only object.
Что не так?

Добавлено через 3 часа 0 минут
Ребята, неужели никто не знает? Вроде не очень сложные вопросы, очень надо.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.04.2013, 21:03     Класс для работы с матрицами - Что дает перегруженный оператор индексирования? #6
Цитата Сообщение от EvengarS Посмотреть сообщение
Что не так?
А что должно увеличиваться? Если кол-во строк и столбцов, то писать надо так хотя бы:
C++
1
2
3
4
5
6
Matrix& operator++() // префиксная
{
   ++col;
   ++row;
   return *this;
};
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
07.04.2013, 21:18  [ТС]     Класс для работы с матрицами - Что дает перегруженный оператор индексирования? #7
У меня был почти такой вариант, только Matrix вместо Matrix&, это существенно?
В любом случае с таким вариантом тоже не работает, програма зависает.
Сейчас такой вариант, можете попробовать скомпилировать?
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
#include <iostream>
#include <stdlib.h>
using namespace std;
 
class Matrix
{
private:
    int row, col;
//  static int numb;
    int ** IntData;
public:
    friend Matrix operator+(const Matrix& l, const Matrix& r);
    Matrix() // конструктор по умолчанию
    {
//      numb++;
        row = 0; col = 0;
        IntData = new int*[row];
                for (int i = 0; i < row; i++){
                    IntData[i] = new int[col];
                }
    }
 
    Matrix(int _row, int _col): row(_row), col(_col) // конструктор c параметрами
    {
//      numb++;
        IntData = new int*[row];
        for (int i = 0; i < row; i++){
            IntData[i] = new int[col];
                 for (int j = 0; j < col; j++){
                     IntData[i][j] = rand();
                 }
             }
    }
    Matrix(const Matrix& m) // конструктор копирования
    {
//      numb++;
        if (row != m.row || col != m.col)
        {
            for(int i = 0; i < row; ++i)
            delete [] IntData[i];
            delete [] IntData;
            row = m.row;
            col = m.col;
            IntData = new int*[row];
            for(int i = 0; i < row; ++i)
                IntData[i] = new int[col];
        }
        for (int i = 0; i < row; ++i)
            for (int j = 0; j < col; ++j)
                IntData[i][j] = m.IntData[i][j];
        };
 
    ~Matrix()
    {
        for (int i = 0; i < row; i++){
        delete[] IntData[i];
        delete[] IntData;
//      numb--;
        }
    }
 
 
    int* operator[](int elem)
    {
        return IntData[elem];
    }
 
    Matrix& operator++() // префиксная
    {
        ++row;
        ++col;
        return *this;
    }
 
    Matrix& operator++(int notused) // постфиксная
    {
        row++;
        col++;
        return *this;
    }
 
    void Display()
    {
         cout << "\n Matrix \n";
         for (int i = 0; i < row; i++){
             cout << "\nRow: " << i << " >";
             for (int j = 0; j < col; j++){
                 cout << " " << IntData[i][j];
             }
         }
         return;
    }
 
    void SubMatrix()
    {
        int x, y, n, m;
        cout << "\nStart element [x][y]" << "\nx = ";
        cin >> x;
        cout << "y = ";
        cin >> y;
        cout << "Submatrix rows = ";
        cin >> m;
        cout << "Submatrix columns = ";
        cin >> n;
        cout << "\n SubMatrix \n";
             for (int i = x; i < m + x; i++){
                 cout << "\nRow: " << i << " >";
                 for (int j = y; j < n + y; j++){
                     cout << " " << IntData[i][j];
                 }
             }
             return;
    }
};
 
    Matrix operator+(const Matrix& l, const Matrix& r)
    {
        if (l.col != r.col || l.row != r.row)
        cout << "wrong matrix size";
        Matrix result(l.row, l.col);
        for (int i = 0; i < l.row; ++i)
        for (int j = 0; j < l.col; ++j)
            result.IntData[i][j] = l.IntData[i][j] + r.IntData[i][j];
        return result;
    };
 
 
int main()
{
    Matrix m1(4, 4);
    m1.Display();
    Matrix m2(5, 5);
    m2.Display();
    ++m1;
    m1.Display();
    Matrix m3 = m1 + m2;
    m3.Display();
 
    system("pause");
    return(0);
}
Без операции ++m1; в main() вполне себе работает
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.04.2013, 21:28     Класс для работы с матрицами - Что дает перегруженный оператор индексирования? #8
EvengarS, в деструкторе ошибка, должно быть так:
C++
1
2
3
4
5
6
7
    ~Matrix()
    {
        for (int i = 0; i < row; i++)
            delete[] IntData[i];
        delete[] IntData;
//      numb--;
    }
Ну и если уж правильно реализовать постфиксную форму инкремента, то он должен возвращать объект ДО увеличения размеров.
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
07.04.2013, 21:36  [ТС]     Класс для работы с матрицами - Что дает перегруженный оператор индексирования? #9
Деструктор поправил, спасибо.
Но инкремент все-равно не работает, даже если использовать префиксную форму, которая там тоже прописана.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.04.2013, 22:51     Класс для работы с матрицами - Что дает перегруженный оператор индексирования? #10
Цитата Сообщение от EvengarS Посмотреть сообщение
Но инкремент все-равно не работает
Потому что нужно память перераспределить под новые размеры.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2013, 23:45     Класс для работы с матрицами - Что дает перегруженный оператор индексирования?
Еще ссылки по теме:

C++ Класс для работы с матрицами
C++ Как использовать перегруженный оператор [ ], если дан не сам класс, а указатель на него?
C++ Создать класс для работы с матрицами

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

Или воспользуйтесь поиском по форуму:
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
07.04.2013, 23:45  [ТС]     Класс для работы с матрицами - Что дает перегруженный оператор индексирования? #11
Еще бы я знал как это правильно сделать...

Так не получается
C++
1
2
3
4
5
6
7
8
9
10
    Matrix& operator++() // префиксная
    {
        ++row;
        ++col;
        IntData = new int*[row];
            for (int i = 0; i < row; i++){
                IntData[i] = new int[col];
                }
        return *this;
    }
Yandex
Объявления
07.04.2013, 23:45     Класс для работы с матрицами - Что дает перегруженный оператор индексирования?
Ответ Создать тему
Опции темы

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