Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
shohbacha
0 / 0 / 0
Регистрация: 16.07.2016
Сообщений: 4
#1

Класс Matrix: реализовать шаблонный класс для двумерных массивов - C++

18.02.2017, 09:01. Просмотров 406. Ответов 6
Метки нет (Все метки)

Доброго времени суток. У меня вопрос: я создал класс Array со внутренним динамическим массивом и объекты этого типа смог создать и я ими пользуюсь как обычными массивами. Подобный класс хочу создать для двумерного массива с именем Matrix. Как создать этот класс, помогите пож-та. Заранее спасибо.
http://www.cyberforum.ru/cpp-beginners/thread724402.html

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
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
 
template <typename T>
class Array
{
    T* mass;
    int len;
public:
    Array()
    {
        this->len = 0;
        this->mass = NULL;
    }
    
    Array(int _len)
    {
        this->len = _len;
        this->mass = new T [this->len];
    }
    
    ~Array()
    {
        delete [] this->mass;
    }
    
    T& operator [] (int index)
    {
        return this->mass[index];
    }
    
    void Free()
    {
        delete [] this->mass;
        this->mass = NULL;
        this->len = 0;
    }
};
 
/*
template <typename T>
class Matrix
{
    Array< Array<T> >* mass;
    int rows;
    int cols;
public:
    Matrix()
    {
        this->rows = this->cols = 0;
        this->mass = NULL;
    }
    
    Matrix(int _rows, int _cols)
        : rows(_rows), cols(_cols)
    {
        this->mass = new Array< Array<T> > (this->rows);
        for (int i = 0; i < this->rows; i++)
            this->mass[i] = new Array<T>(this->cols);
    }
    
    Array<T>& operator [] (int index)
    {
        return this->mass[index];
    }
    
    void Free()
    {
        for (int i = 0; i < this->rows; i++)
            mass[i].Free();
        this->rows = this->cols = 0;
        this->mass = NULL;
    }
};
*/
 
int main()
{
    srand(time(0));
    
    Array<int> mass(15);
    for (int i = 0; i < 15; i++)
        mass[i] = rand() % (99 - 10 + 1) + 10;
    
    for (int i = 0; i < 15; i++)
        cout << mass[i] << "\t";
    
    mass.Free();
    
    
    /*
    
    int M, N;
    cout << "M = "; cin >> M;
    cout << "N = "; cin >> N;
    Matrix<int> matr(M, N);
    
    for (int i = 0; i < M; i++)
    {
        for (int j = 0; j < N; j++)
        {
            matr[i][j] = rand() % (99 - 10 + 1) + 10;
            cout << matr[i][j] << "\t";
        }
        cout << endl;
    }
    
    matr.Free();
    */
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2017, 09:01
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Класс Matrix: реализовать шаблонный класс для двумерных массивов (C++):

Реализовать класс matrix
реализовать класс matrix. класс предназначен для работы с типом данных таблица....

Необходимо реализовать шаблонный класс Array, и грамотно реализовать push_back
Необходимо реализовать шаблонный класс Array, параметризируемый типом хранимых ...

Реализовать шаблонный класс
В общем требуется реализовать шаблонный класс FixedArray&lt;T,N&gt; FixedArray...

Спроектировать и реализовать класс Matrix
Спроектировать и реализовать класс Matrix, предназначенный для работы с...

Реализовать шаблонный класс property
Необходимо реализовать шаблонный класс property, реализующийся на С++ станд....

6
Bretbas
Каждому свое
518 / 204 / 81
Регистрация: 05.08.2013
Сообщений: 1,610
Завершенные тесты: 2
18.02.2017, 09:27 #2
shohbacha, Ну наверное вот так:
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
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
 
template <typename T>
class Array
{
    T* mass;
    int len;
public:
    Array()
    {
        this->len = 0;
        this->mass = NULL;
    }
    
    Array(int _len)
    {
        this->len = _len;
        this->mass = new T [this->len];
    }
    
    ~Array()
    {
        delete [] this->mass;
    }
    
    T& operator [] (int index)
    {
        return this->mass[index];
    }
    
    void Free()
    {
        delete [] this->mass;
        this->mass = NULL;
        this->len = 0;
    }
};
 
 
template <typename T>
class Matrix
{
    Array< Array<T>* > mass;
    int rows;
    int cols;
public:
    Matrix()
    {
        this->rows = this->cols = 0;
        this->mass = NULL;
    }
    
    Matrix(int _rows, int _cols)
        : rows(_rows), cols(_cols), mass(this->rows)
    {
        for (int i = 0; i < this->rows; i++)
            mass[i] = new Array<T>(this->cols);
    }
    
    Array<T>& operator [] (int index)
    {
        return *mass[index];
    }
    
    void Free()
    {
        for (int i = 0; i < this->rows; i++)
            mass[i] -> Free();
        this->rows = this->cols = 0;
        this->mass = NULL;
    }
};
 
 
int main()
{
    srand(time(0));
    
    Array<int> mass(15);
    for (int i = 0; i < 15; i++)
        mass[i] = rand() % (99 - 10 + 1) + 10;
    
    for (int i = 0; i < 15; i++)
        cout << mass[i] << "\t";
    
    mass.Free();
    
    
    
    
    int M, N;
    cout << "M = "; cin >> M;
    cout << "N = "; cin >> N;
    Matrix<int> matr(M, N);
    
    for (int i = 0; i < M; i++)
    {
        for (int j = 0; j < N; j++)
        {
            matr[i][j] = rand() % (99 - 10 + 1) + 10;
            cout << matr[i][j] << "\t";
        }
        cout << endl;
    }
    
    matr.Free();
    
    return 0;
}
0
New man
159 / 97 / 39
Регистрация: 23.05.2011
Сообщений: 569
Завершенные тесты: 2
18.02.2017, 15:46 #3
Цитата Сообщение от Bretbas Посмотреть сообщение
C++
1
this->mass = NULL;
Тут ошибка.

А идея хорошая.

Но я бы сделал так, без указателей вообще. Благодаря этому можно не следить за памятью - она будет чиститься автоматически.

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
template <typename T>
class Matrix
{
    Array<Array<T>> mass;
    int rows;
    int cols;
public:
    Matrix():this(0,0)
    {
    }
    
    Matrix(int _rows, int _cols)
        : rows(_rows), cols(_cols), mass(this->rows)
    {
        for (int i = 0; i < this->rows; i++)
            mass[i] = Array<T>(this->cols);
    }
    
    // Вот это меня напрягает, даёт возможность снаружи менять размер внутреннего массива.
    // Так можно прийти к строкам разной длины в массиве.
    // Но можно и оставить. Мой вариант ниже.
    Array<T>& operator [] (int index)
    {
         return mass[index];
    }
 
    T& Elem(int row, int col){
         if (row<0 || col <0 || row>= rows || col>= cols)
             throw std::out_of_range("indexes out of range");
         return mass[row][col];
    }
};
Добавлено через 8 минут
А если уж юзать указатели, то так лучше, наверно:

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
template <typename T>
class Matrix
{
private:
   size_t row_count;
   size_t col_count;
   T* data;
 
public:
   Matrix(size_t rows, size_t cols):row_count(rows), col_count(cols)
   {
      data = new T[row_count*col_count];
   }
   Matrix():Matrix(0,0){}
   
   T& Element(size_t row, size_t col)
   {
      if (row<0 || col <0 || row>= rows()|| col>= cols())
             throw std::out_of_range("indexes out of range");
         return data[row*cols()+col];
   }
 
   const size_t& cols() const {return col_count;}
   const size_t& rows() const {return row_count;}
 
   ~Matrix()
   {
      delete[] data;
   }
};
Добавлено через 3 минуты
Цитата Сообщение от New man Посмотреть сообщение
C++
1
Matrix():this(0,0)
Упс, ошибка. Должно быть Matrix():Matrix(0,0){}
0
Bretbas
Каждому свое
518 / 204 / 81
Регистрация: 05.08.2013
Сообщений: 1,610
Завершенные тесты: 2
18.02.2017, 17:31 #4
New man,
Цитата Сообщение от New man Посмотреть сообщение
Тут ошибка.
Ну не совсем ошибка Просто такое присваивание. А так просто не удалил это в коде автора
0
shohbacha
0 / 0 / 0
Регистрация: 16.07.2016
Сообщений: 4
19.02.2017, 21:13  [ТС] #5
Большое спасибо! По таджикски: Рахмати калон!
0
Pewpewpewpew
4 / 4 / 2
Регистрация: 09.07.2016
Сообщений: 62
20.02.2017, 17:31 #6
А как на основании этого сделать присваивание (пусть операция индексации перегружена)? Ну например
Matrix m(2,3);
m[1][2] = 4;

Добавлено через 22 минуты
Это вопрос перегрузки = или операции взятия по индексу?
0
New man
159 / 97 / 39
Регистрация: 23.05.2011
Сообщений: 569
Завершенные тесты: 2
20.02.2017, 17:51 #7
Индексирование - это метод, который возвращает ссылку на элемент. Посмотрите описание работы со ссылками.


А перегружать = надо тогда, когда мы изменяем сразу все элементы.
1
20.02.2017, 17:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2017, 17:51
Привет! Вот еще темы с решениями:

Реализовать шаблонный класс или функцию
Опишите параметризованный класс односвязный список элементов (параметр – тип)....

Шаблоны. Реализовать шаблонный класс очередь
Реализовать шаблонный класс очередь. Реализовать все основные операции:...

Реализовать класс ModelWindow, добавив поле для курсора, используя для представления поля класс Cursor
Реализовать класс ModelWindow, добавив поле для курсора. Используйте для...

Реализовать класс Goods используя для представления цены класс Money
Реализовать класс Goods (пункт 1 ), используя для представления цены класс...


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

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

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