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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.70
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
24.06.2011, 17:00     Матрица, перегрузка операторов #1
Дня доброго.
Есть такая вот задачка:
24.02.Создать класс для работы с матрицами. Предусмотреть, как минимум, функции для сложения матриц,
умножения матриц, транспонирования матриц, присваивания матриц друг другу, установка и получение
произвольного элемента матрицы. Необходимо перегрузить соответствующие операторы
есть вот такой класс
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-го класса.
Но как факт ни... ничего не понял.
кто сталкивался просветите, буду благодарен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2011, 17:00     Матрица, перегрузка операторов
Посмотрите здесь:

C++ перегрузка операторов C++
Перегрузка операторов C++
Класс матрица. Контструктор, деструктор и перегрузка операторов. C++
перегрузка операторов C++
Перегрузка операторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
24.06.2011, 22:01     Матрица, перегрузка операторов #22
no0ker,
если класс матрица состоит из векторов, то перегрузи сначала Vector& Matrix::operator[](int i); для класса матрицы, а для класса вектора перегрузи int& Vector::operator[] (int j);
no0ker
24.06.2011, 22:26
  #23

Не по теме:

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

sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 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;
}
мой вариант на скорую руку.
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
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];
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2011, 12:13     Матрица, перегрузка операторов
Еще ссылки по теме:

C++ Перегрузка операторов
C++ Перегрузка операторов(=,+)
C++ Перегрузка операторов С++

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

Или воспользуйтесь поиском по форуму:
no0ker
100 / 87 / 4
Регистрация: 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]; // вызовется константный метод
Yandex
Объявления
25.06.2011, 12:13     Матрица, перегрузка операторов
Ответ Создать тему
Опции темы

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