Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.70
LineStown
66 / 66 / 6
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
#1

Матрица, перегрузка операторов - C++

24.06.2011, 17:00. Просмотров 4560. Ответов 25
Метки нет (Все метки)

Дня доброго.
Есть такая вот задачка:
24.02.Создать класс для работы с матрицами. Предусмотреть, как минимум, функции для сложения матриц,
умножения матриц, транспонирования матриц, присваивания матриц друг другу, установка и получение
http://www.cyberforum.ru/cpp-beginners/thread2148393.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
#include<iostream>
using namespace std;
class matrix
{
private:
    int x,y;
    int **m;
public:
    matrix()
    {
        **m=NULL;
        x=0;
        y=0;
    }
    matrix(int xx,int yy)
    {
        x=xx;
        y=yy;
        m=new int *[y];
        for(int i=0;i<y;i++)
            *(m+i)=new int[x];
    }
    matrix(int **q,int xx,int yy)
    {
        x=xx;
        y=yy;
        m=new int *[y];
        for(int i=0;i<y;i++)
            *(m+i)=new int[x];
        for(int i=0;i<y;i++)
            for(int j=0;j<0;j++)
                m[j][i]=q[j][i];
    }
    ~matrix()
    {
        for(int i=0;i<y;i++)
            delete []*(m+i);
        delete []m;
    }
};
int main()
{
    setlocale(LC_ALL,"Russian");
    return EXIT_SUCCESS;
}
Есть проблема: перегрузить [][].Упарился искать решение, пишут что можно сделать 2-й класс внутри первого - типа строки, и в перегрузке[] 1-го класса вызывать перегрузку [] 2-го класса.
Но как факт ни... ничего не понял.
кто сталкивался просветите, буду благодарен
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2011, 17:00
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Матрица, перегрузка операторов (C++):

Класс "Матрица": конструктор, деструктор и перегрузка операторов
Матрица – KMatrix Методы: конструкторы,...

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

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

Перегрузка операторов
Описать класс «массив вещественных чисел». В классе предусмотреть методы...

Перегрузка операторов
Всем привет. Мне нужно ввести класс для работы с объектом &quot;рациональная дробь&quot;...

25
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
24.06.2011, 22:00 #21
Я предлагал так:

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
#include <iostream>
 
class Row
{
public:
    Row(size_t size = 1):
    m_size(size),
    m_row(new double [m_size])
    {
        for (size_t i = 0; i < m_size; ++i)
            m_row[i] = 0.0;
    }
 
    Row(const Row &source):
    m_size(source.m_size),
    m_row(new double [m_size])
    {
        for (size_t i = 0; i < m_size; ++i)
            m_row[i] = source.m_row[i];
    }
 
    ~Row()
    {
        delete [] m_row;
    }
 
    void resize(size_t new_size)
    {
        double *new_row = new double [new_size];
 
        for (size_t i = 0; i < m_size; ++i)
            new_row[i] = m_row[i];
 
        for (size_t i = m_size; i < new_size; ++i)
            new_row[i] = 0.0;
        
        delete [] m_row;
 
        m_row = new_row;
        m_size = new_size;
    }
 
    double &operator[](size_t index)
    {
        return m_row[index];
    }
 
    const double &operator[](size_t index) const
    {
        return m_row[index];
    }
 
private:
    size_t m_size;
    double *m_row;
};
 
class Matrix
{
public:
    Matrix(size_t rows = 1, size_t cols = 1):
    m_rows(rows),
    m_matrix(new Row [m_rows])
    {
        for (size_t i = 0; i < m_rows; ++i)
            m_matrix[i].resize(cols);
    }
 
    ~Matrix()
    {
        delete [] m_matrix;
    }
 
    Row &operator[](size_t index)
    {
        return m_matrix[index];
    }
 
    const Row &operator[](size_t index) const
    {
        return m_matrix[index];
    }
 
private:
    size_t m_rows;
    Row *m_matrix;
};
 
int main()
{
    const size_t rows = 2;
    const size_t cols = 2;
 
    Matrix m(rows, cols);
 
    for (size_t i = 0; i < rows; ++i)
        for (size_t j = 0; j < cols; ++j)
            m[i][j] = i + j;
 
    for (size_t i = 0; i < rows; ++i)
    {
        for (size_t j = 0; j < cols; ++j)
            std::cout << m[i][j] << "  ";
 
        std::cout << std::endl;
    }
 
    return 0;
}
Добавлено через 3 минуты
Метод pito211:

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
#include <iostream>
 
class Matrix
{
public:
    Matrix(size_t rows = 1, size_t cols = 1):
    m_rows(rows),
    m_cols(cols),
    m_matrix(new double *[m_rows])
    {
        for (size_t i = 0; i < m_rows; ++i)
            m_matrix[i] = new double [m_cols];
    }
 
    ~Matrix()
    {
        for (size_t i = 0; i < m_rows; ++i)
            delete [] m_matrix[i];
 
        delete [] m_matrix;
    }
 
    double *operator[](size_t index)
    {
        return m_matrix[index];
    }
 
    const double *operator[](size_t index) const
    {
        return m_matrix[index];
    }
 
private:
    size_t m_rows;
    size_t m_cols;
    double **m_matrix;
};
 
int main()
{
    const size_t rows = 2;
    const size_t cols = 2;
 
    Matrix m(rows, cols);
 
    for (size_t i = 0; i < rows; ++i)
        for (size_t j = 0; j < cols; ++j)
            m[i][j] = i + j;
 
    for (size_t i = 0; i < rows; ++i)
    {
        for (size_t j = 0; j < cols; ++j)
            std::cout << m[i][j] << "  ";
 
        std::cout << std::endl;
    }
 
    return 0;
}
1
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
24.06.2011, 22:01 #22
no0ker,
если класс матрица состоит из векторов, то перегрузи сначала Vector& Matrix::operator[](int i); для класса матрицы, а для класса вектора перегрузи int& Vector::operator[] (int j);
1
no0ker
24.06.2011, 22:26
  #23

Не по теме:

silent_1991, метод pito211 попроще вроде будет. =)

0
sandye51
программист С++
833 / 592 / 147
Регистрация: 19.12.2010
Сообщений: 2,016
24.06.2011, 22:46 #24
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
#include <iostream>
#include <cstdlib>
#include <clocale>
#include <conio.h>
 
template <typename T>
class vector
{
    size_t _size;
protected:
    T* ptr;
public:
    vector() : _size(), ptr() { }
    explicit vector(size_t _size) : _size(_size)
    {
        ptr = new T[_size];
        for (size_t i = 0; i < _size; ++i)
            ptr[i] = T();
    }
    vector(const vector& copyVector) : _size(copyVector._size)
    {
        ptr = new T[_size];
        for (size_t i = 0; i < _size; ++i)
            ptr[i] = copyVector.ptr[i];
    }
    template <typename S>
    vector(const vector<S>& copyVector) : _size(copyVector._size())
    {
        ptr = new T[_size];
        for (size_t i = 0; i < _size; ++i)
            ptr[i] = copyVector[i];
    }
    template <typename S>
    vector(size_t _size, const T& value) : _size(_size)
    {
        ptr = new T[_size];
        for (size_t i = 0; i < _size; ++i)
            ptr[i] = value;
    }
 
    size_t size() const throw()
    {
        return _size;
    }
 
    T& operator[](size_t index)
    {
        return ptr[index]; 
    }
 
    template <typename S>
    const T& operator= (const vector<S>& copyVector)
    {
        re_size(copyVector._size());
        for (size_t i = 0; i < _size; ++i)
            ptr[i] = copyVector[i];
        return *this;
    }
 
    const vector& operator=(const vector& copyVector)
    {
        re_size(copyVector.size());
        for (size_t i = 0; i < _size; ++i)
            ptr[i] = copyVector.ptr[i];
        return *this;
    }
 
    T at(size_t index) const
    {
        return ptr[index];
    }
 
    void re_size(size_t new__size) 
    {
        T* tmp = new T[new__size];
        size_t tmp__size = _size < new__size ? _size : new__size;
        for (size_t i = 0; i < tmp__size; ++i)
            tmp[i] = ptr[i];
        delete[] ptr;
        ptr = tmp;
        if (_size < new__size)
            for (size_t i = _size; i < new__size; ++i)
                ptr[i] = T();
        _size = new__size;
    }
 
    friend std::ostream& operator<< (std::ostream& file, const vector& buffer)
    {
        size_t size = buffer.size();
        for (size_t i = 0; i < size; ++i)
            file << buffer.at(i) << " ";
        file << std::endl;
        return file;
    }
 
    typedef T value_type;
};
 
template <typename T>
class matrix : public vector<vector<T> >
{
public:
    matrix(size_t m,  size_t n) : vector<vector<T> >(m)
    {
        for (size_t i = 0; i < m; ++i)
            this->ptr[i].re_size(n);
    }
    template <typename S>
    matrix(size_t _size, const vector<S>& vectorTmp) : vector<vector<T> >(_size, vectorTmp) { }
};
 
int main()
{
    const size_t rows = 4;
    const size_t cols = 5;
 
    matrix<int> m(rows, cols);
 
    for (size_t i = 0; i < rows; ++i)
        for (size_t j = 0; j < cols; ++j)
            m[i][j] = i + j;
 
//  for (size_t i = 0; i < rows; ++i)
//  {
//      for (size_t j = 0; j < cols; ++j)
//          std::cout << m[i][j] << "  ";
// 
//      std::cout << std::endl;
//  }
    std::cout << m;
 
    _getch();
    return EXIT_SUCCESS;
}
мой вариант на скорую руку.
0
LineStown
66 / 66 / 6
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
25.06.2011, 11:29  [ТС] #25
silent_1991,
хотелось бы уточнить, зачем тут 2 перегрузки?
C++
1
2
3
4
5
6
7
8
9
double *operator[](size_t index)
    {
        return m_matrix[index];
    }
 
    const double *operator[](size_t index) const
    {
        return m_matrix[index];
    }
0
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
25.06.2011, 12:13 #26
LineStown, одна перегрузка, видимо, для нормальной работы константных функций, то есть для тех, которые не могут изменять поля в объекте.

и если создадите константный объект, то сможете вызывать только константные методы.
C++
1
2
3
    const Matrix Mc(rows,cols);
    Mc[1][1] = 1; // нельзя, объект константный
    int tmp = Mc[1][1]; // вызывается константный метод константного объекта
или, например, будете работать с указателем на константный объект
C++
1
2
3
4
    Matrix Mnc(rows, cols);
    const Matrix * Mp = &Mnc;
    (*Mp)[1][1]=1; // ошибка, нельзя изменить данные по указателю на константный объект
    int tmp = (*Mp)[1][1]; // вызовется константный метод
0
25.06.2011, 12:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2011, 12:13
Привет! Вот еще темы с решениями:

Перегрузка операторов <<, >>
у меня есть класс, к примеру template &lt;typename type&gt; class ls { private:...

Перегрузка операторов >>
доброго времени суток. не как не получаеться перегрузить операторы класса. в...

Перегрузка операторов
Всем Hello world! Изучаю C++, сейчас дошёл до классов, а точнее до перегрузки...

перегрузка операторов
Всем привет. Дошел до темы перегрузки операторов и возникло два вопроса....


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

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

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