Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.81
maks_b1
1 / 1 / 0
Регистрация: 26.11.2011
Сообщений: 29
#1

Класс "Матрица": конструктор, деструктор и перегрузка операторов - C++

20.12.2011, 22:02. Просмотров 4660. Ответов 22
Метки нет (Все метки)

Матрица – KMatrix
Методы:
конструкторы, деструктор;
операции: [], =, ==, !=, +, +=, –, –=, *, *=, <<, >>
функции:
Transpose – транспонирование матрицы,
Rows() – количество строк,
Cols() – количество колонок,
Swap() - обменять значения (т.е. матрицы).
Примечание:
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2011, 22:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс "Матрица": конструктор, деструктор и перегрузка операторов (C++):

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор - C++
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

Перегрузка операторов для класса "Матрица" - C++
Доброго времени суток. Помогите довести до ума код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;conio.h&quot; #include &quot;math.h&quot;...

Класс "Дроби" и перегрузка операторов для этого класса - C++
Всем Доброго времени суток. Есть учебная задача по условиям которой необходимо реализовать класс &quot;Дроби&quot; и перегрузку операторов для...

Класс "Матрица". Перегрузка оператора "минус" - C++
Помогите дописать программу или исправить ее. Нужно было написать программу, где создать класс матрицы, используя двухмерный динамический...

Класс "динамический массив", перегрузка операторов +, = - C++
Делаю класс динамического массива. Перегружая при этом операторы. На данный момент банально не могу перегрузить + и =. Visual Studio...

Класс "Прямая". Перегрузка операторов - C++
Очень нужна ваша помощь, скоро сдавать лабораторную, а у меня затруднения.. Не могу сделать.. Тема: Перегрузка операций Класс:...

22
zss
Модератор
Эксперт С++
6539 / 6101 / 2010
Регистрация: 18.12.2011
Сообщений: 15,878
Завершенные тесты: 1
20.12.2011, 22:03 #2
А что конкретно Вам непонятно?
Не выписывать же сюда весь справочник по ООП.
0
maks_b1
1 / 1 / 0
Регистрация: 26.11.2011
Сообщений: 29
21.12.2011, 07:11  [ТС] #3
Я не понимаю,как это все реализовать?!
0
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
21.12.2011, 07:57 #4

Не по теме:


Цитата Сообщение от maks_b1 Посмотреть сообщение
Я не понимаю,как это все реализовать?!
вы наверное на одном курсе учитесь ТЫК Вам надо скооперироваться. Задачи то аналогичные. Хоть одна голова хорошо, а две - некрасиво. Зато шансов на решение больше.



Добавлено через 27 минут
как пример.
файл-заголовок в котором вы будете описывать ваш класс может выглядеть так.
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
#ifndef KMATRIX_H
#define KMATRIX_H
 
#include <iostream>
using std::ostream;
using std::istream;
 
class KMatrix {
public:
    KMatrix(int = 10, int = 10); //конструктор по умолчанию если не указан размер матрицы то создается матрица 10 на 10 
    ~KMatrix(); //деструктор
 
    friend ostream &operator<<(ostream &);
    friend istream &operator>>(istream &);
 
    //объявление функций перегрузки операторов
    int &operator[](int);
    const KMatrix &operator=(const KMatrix &);
    bool operator==(const KMatrix &) const;
    bool operator!=(const KMatrix &right) const;
    const KMatrix &operator+=(const KMatrix &);
    const KMatrix &operator-=(const KMatrix &);
    const KMatrix &operator+(const KMatrix &);
    const KMatrix &operator-(const KMatrix &);
    const KMatrix &operator*=(const KMatrix &);
    const KMatrix &operator*(const KMatrix &); //для умножения матрицы на матрицу
    const KMatrix &operator*(const int &); //это для умножения матрицы на целое число
    const KMatrix &operator*(const float &); //это для умножения матрицы на вещественное  число
                                             // и т.д.
 
    //get-еры set-еры
    int getColumns() const;
    void setColumns(int);
    int getRows() const;
    void setRows(int);
 
private:
    int **myMatrix;
    int rows;
    int columns;
 
};
 
#endif
теперь выполнить реализацию каждого метода класса. начиная с конструктора. Заканчия всем остальным. Работенки не мало одном словом.
1
maks_b1
1 / 1 / 0
Регистрация: 26.11.2011
Сообщений: 29
27.12.2011, 23:37  [ТС] #5
а можете , для примера описать какую либо функцию.
0
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.12.2011, 06:53 #6
Цитата Сообщение от maks_b1 Посмотреть сообщение
а можете , для примера описать какую либо функцию.
в качестве примеров написал перегрузку печати матрицы на стандартный вывод, умножения матрицы на целое число и оператора присвоения. Все выполнено в одном файле. (посчитал что так вам будет легче скомпилировать и запусить проект)
Прошу вас обратить внимание на способ перегрузки оператора [] для матрицы. Все дело в том что нельзя перегрузить оператор [][]. Возможно мой способ далек от совершенства но он работает. Если кто-то из людей знающих предложет что-то более простое но чтобы можно было использовать квадартные скобки, буду очень благодарен.
спрашивайте если что-то непонятно.
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include <iostream>
using std::istream;
using std::ostream;
using std::cout;
using std::cin;
using std::endl;
 
#include <iomanip>
using std::setw;
 
#include <cstdlib>
using std::rand;
using std::srand;
 
#include <ctime>
using std::time;
 
class KMatrix {
 
    //overloading >>  operators
    friend ostream &operator<<(ostream &, const KMatrix&);
 
private:
    int **myMatrix;
    int rows;
    int columns;
 
    int &getValue(int r, int c) {
        return this->myMatrix[r][c];
    }
 
    //this class is help class to overload  matrix subscript operator [][]
    class KMatrixRow {
    public:
        KMatrixRow(KMatrix &k, int row) :
                km(k) {
            if (row < 0 || row >= k.rows) {
                x = 0;
            } else {
                x = row;
            }
        }
        int &operator[](int y) {
            return km.getValue(x, y);
        }
    private:
        KMatrix &km;
        int x; // row number
    };
 
public:
    KMatrix(int = 4, int = 4); //конструктор по умолчанию если не указан размер матрицы то создается матрица 10 на 10
    ~KMatrix(); //деструктор
 
    void setToZero(); //set all values of matrix to 0
    void setRandValues(int = 0, int = 100); //fill matrix with random values
 
    //overload subscript operator.
    KMatrixRow operator[](int);
 
    //overload multiplication operator
    //multiply matrix with int value
    KMatrix &operator*(const int &);
 
    //overload assignment operator
    KMatrix &operator=(KMatrix &);
 
};
 
//constructor
KMatrix::KMatrix(int r, int c) :
        rows(r > 0 ? r : 4), columns(c > 0 ? c : 4) {
    myMatrix = new int*[r];
    for (int i = 0; i < rows; ++i) {
        myMatrix[i] = new int[columns];
    }
    setToZero();
}
 
//fill matrix with random values
void KMatrix::setRandValues(int from, int to) {
    srand(time(NULL));
    for (int i = 0; i < this->rows; ++i) {
        for (int j = 0; j < this->columns; ++j) {
            this->myMatrix[i][j] = (from + rand() % to);
        }
    }
}
 
//overload assignment operator
KMatrix &KMatrix::operator=(KMatrix &right) {
    if (&right != this) { // проверяем не присваиваем ли объект сам себе
        for (int i = 0; i < rows; ++i) { //deallocate memory
            delete[] this->myMatrix[i]; //for each row
        }
        delete[] this->myMatrix; //and matrix
 
        this->rows = right.rows;
        this->columns = right.columns;
 
        //create new matrix
        this->myMatrix = new int*[right.rows];
        for (int i = 0; i < this->rows; ++i) {
            this->myMatrix[i] = new int[right.columns];
        }
 
        //fill new matrix with values of right matrix
        for (int i = 0; i < this->rows; ++i) {
            for (int j = 0; j < this->columns; ++j) {
                this->myMatrix[i][j] = right[i][j];
            }
        }
    }
    return *this;
}
 
//overload multiplication operator
KMatrix &KMatrix::operator*(const int &num) {
 
    for (int i = 0; i < this->rows; ++i) {
        for (int j = 0; j < this->columns; ++j) {
            this->myMatrix[i][j] = this->myMatrix[i][j]*num;
        }
    }
    return *this;
}
 
//overload subscript operator
KMatrix::KMatrixRow KMatrix::operator[](int x) {
    return KMatrixRow(*this, x);
}
 
//overloaded outsream operator;
ostream &operator<<(ostream &out, const KMatrix &km) {
    for (int i = 0; i < km.rows; ++i) {
        for (int j = 0; j < km.columns; ++j) {
            out << setw(4) << km.myMatrix[i][j];
        }
        out << endl;
    }
    return out;
}
 
//set all elements of matrix to 0
void KMatrix::setToZero() {
    for (int i = 0; i < this->rows; ++i) {
        for (int j = 0; j < this->columns; ++j) {
            this->myMatrix[i][j] = 0;
        }
    }
}
 
//destructor
KMatrix::~KMatrix() {
}
 
int main(void) {
 
    //create KMatrix instance
    KMatrix km(5, 5);
 
    cout << "After initialising\n";
    cout << km;
 
    //set some values
    km[0][0] = 10;
    km[0][1] = 15;
    km[2][3] = 33;
 
    //print results
    cout << "\n\nAfter setting same elements";
    cout << "\n"<< km;
 
    //fill with random values
    km.setRandValues();
 
    //print matrix with random values
    cout << "\n\nAfter setting random values";
    cout << "\n" << km;
 
    int a = 2;
    KMatrix newMatrix;
 
    newMatrix = km * a;
 
    cout << "\n\nAfter multiplying by int value (2)";
    cout << "\n" << newMatrix;
 
    cin.get();
    return 0;
}

Не по теме:

С вам пиво С Наступающим!



Добавлено через 1 минуту
- = ВЫВОД = -

After initialising
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0


After setting same elements
10 15 0 0 0
0 0 0 0 0
0 0 0 33 0
0 0 0 0 0
0 0 0 0 0


After setting random values
77 97 36 14 78
39 96 41 41 43
10 43 6 1 34
94 62 16 91 83
67 53 38 51 29


After multiplying by int value (2)
154 194 72 28 156
78 192 82 82 86
20 86 12 2 68
188 124 32 182 166
134 106 76 102 58

1
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
28.12.2011, 10:32 #7
greeezz, прочитал код, класс row Имхо здесь не нужен.

Цитата Сообщение от greeezz Посмотреть сообщение
предложет что-то более простое но чтобы можно было использовать квадартные скобки
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
#include <iostream.h>
#include <conio.h>
 
class matrix
{
   public:
 
   matrix(int, int, int = 0);
   ~matrix();
 
   float*& operator[](int) const;
 
   void operator*=(matrix& b);
   void operator/=(matrix& b);
 
 
   private:
 
   float **mPtr;
 
   int n;
 
   int m;
}
 
matrix::matrix(int nk, int mk, int init)
{
   **mPtr = new (float[nk])[mk];
 
   n = nk;
 
   m = mk;
 
   for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
     mPtr[i][j] = init;
}
 
matrix::~matrix ()
{
   delete [] mPtr;
}
 
float*& matrix::operator[](int nk) const
{
   if ((nk > n-1) || (nk < 0))
      cout << "Error: array overflow..." << endl;
   return mPtr[nk];
}
 
 
 
 
 
main ()
{
   clrscr();
 
   matrix m(10, 15);
 
   m[3][3] = 32;
 
   cout << m[3][3] << endl;
 
   getch();
 
   return 0;
}
PS перегружал для float.
0
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.12.2011, 10:42 #8
dimcoder, строки 166, 167, 168 имеют место быть (а именно работать) только потому что я выполненил перегрузку оператора [].
но сама реализация перегрузки на мой взгляд не очевидная.

Добавлено через 9 минут
Цитата Сообщение от dimcoder Посмотреть сообщение
#include <iostream.h>
и такое бывает?
строка 24. нет точки с запятой.
строка 28. вообще не понял. буду благодарен за разъяснения.
строка 55. int main() ...
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
28.12.2011, 10:56 #9
Цитата Сообщение от greeezz Посмотреть сообщение
и такое бывает?
бывает. У меня только так и бывает, borland 3.0

Цитата Сообщение от greeezz Посмотреть сообщение
нет точки с запятой.
Странно, но у меня не требует. А так по идее конечно следовало бы её там стоять...


Цитата Сообщение от greeezz Посмотреть сообщение
строка 28. вообще не понял. буду благодарен за разъяснения.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream.h>
#include <conio.h>
 
main ()
{
   float **mPtr;
   **mPtr = new (float[5])[6];
   mPtr[3][5] = 23;
   cout << mPtr[3][5];
   getch();
   return 0;
}
Ну как объяснить, выделяем динамическую память...
Цитата Сообщение от greeezz Посмотреть сообщение
строка 55. int main() ...
Старая привычка
0
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.12.2011, 11:06 #10
Цитата Сообщение от dimcoder Посмотреть сообщение
borland 3.0
ну тогда понятно.
такое по всей видимости только в борланде и бывает. а у меня например
C++
1
**mPtr = new (float[5])[6];
error: array bound forbidden after parenthesized type-id
error: cannot convert 'float*' to 'float' in assignment

Добавлено через 4 минуты
вроде как в обычном с++ строки
C++
1
2
float **mPtr;
**mPtr = new (float[5])[6]
будут выглядеть
C++
1
2
3
4
5
   float **mPtr;
   mPtr = new float*[5];
   for(int i = 0; i < 5; ++i){
       mPtr[i] = new float[6];
   }
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
28.12.2011, 11:08 #11
Цитата Сообщение от greeezz Посмотреть сообщение
error: array bound forbidden after parenthesized type-id
error: cannot convert 'float*' to 'float' in assignment
C++
1
*mPtr = new (float[5])[6];//Bez odnoy *
Если не пройдёт, создавайте как положено.
0
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.12.2011, 11:11 #12
Цитата Сообщение от dimcoder Посмотреть сообщение
C++
1
*mPtr = new (float[5])[6];//Bez odnoy *
Если не пройдёт, создавайте как положено.
error: array bound forbidden after parenthesized type-id

так вот в том и дело что, как положено, у меня получилось перегрузить оператор [] только с использованием так скажем вспомогательного класса.
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
28.12.2011, 11:36 #13
greeezz, вы же сами написали как правильно создать динамическую матрицу. Короче попробуйте это в http://liveworkspace.org/
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
#include <iostream>
using namespace std;
 
class matrix
{
   public:
 
   matrix(int, int, int = 0);
   ~matrix();
 
   float*& operator[](int) const;
 
   void operator*=(matrix& b);
   void operator/=(matrix& b);
 
 
   private:
 
   float **mPtr;
 
   int n;
 
   int m;
};
 
matrix::matrix(int nk, int mk, int init)
{
   //**mPtr = new (float[nk])[mk];
   mPtr = new float*[nk];
   for (int x = 0; x < nk; x++)
      mPtr[x] = new float[6];
 
   n = nk;
 
   m = mk;
 
   for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
    mPtr[i][j] = init;
}
 
matrix::~matrix ()
{
   delete [] mPtr;
}
 
float*& matrix::operator[](int nk) const
{
   if (nk > n-1)
      cout << "Error: array overflow..." << endl;
   return mPtr[nk];
}
 
 
 
 
 
main ()
{
   
 
   matrix m(10, 15);
 
   m[3][3] = 32;
 
   cout << m[3][3] << endl;
 
   return 0;
}
1
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.12.2011, 11:36 #14
dimcoder,
спасибо!
а можете объяснить float*& operator[](int) ...
меня интересует *& в данной функции.

если сказать правильнее у меня ощущение что я не понимаю что возвращает функция
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
28.12.2011, 11:43 #15
Цитата Сообщение от greeezz Посмотреть сообщение
*&
Вовращает указатель на разыменованный указатель. Хотя это заморочки... Можете амперсанд(&)убрать, не знаю нахрен я его туда вообще влепил :-D Надо подумать ________
Короче так работать тоже будет:
C++
1
float* operator[](int)
Но смысл вот в чём. Значит функция возвращает указатель, а там уж дела c++ и стандартного типа float, всё как у обычного массива. Хотя казалось бы...
0
28.12.2011, 11:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2011, 11:43
Привет! Вот еще темы с ответами:

Класс "Дата", перегрузка операторов - C++
Доброго времени суток,многоуважаемые форумчане! Делали лабу, по перегрузке операторов в классе, но в итоге выдает какой-то мусор. ума не...

Класс "Точка", перегрузка операторов - C++
не могу найти где накосячил. тестил только арифметику. при выполнении получаю следующее: # include &lt;iostream&gt; using namespace...

Класс "Матрица", перегрузка оператора "+" - C++
Здравствуйте. Создаю класс матрица, в нём перегружаю оператор &quot;+&quot;. На этапе компиляции всё замечательно, но при запуске программа вылетает....

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this - C++
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...


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

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

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