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

матрица. клас - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
12.02.2012, 17:08     матрица. клас #1
Решил создать класс квадратных матриц. Вот что получилось. Все работает, но хотелось бы услышать
Ваше мнение и любые(ВСЕ) замечания

matrix.hpp
объявление
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
#ifndef _MATRIX_
#define _MATRIX_
 
#include <vector>
#include <iostream>
 
typedef std::vector<int>      T_vector;
typedef std::vector<T_vector> T_matrix;
 
class matrix
{
public:
    matrix();
    matrix(int size);
    //----------------------------------------
    const matrix operator-();
    
    bool   operator== (const matrix& m);
    bool   operator!= (const matrix& m);
    
    matrix operator=  (const matrix& matr); 
    matrix operator+  (const matrix& matr);
    matrix operator-  (const matrix& matr);
    
    friend std::ostream& operator<<(std::ostream& stream, const matrix& matr);
    friend std::istream& operator>>(std::istream& stream,       matrix& matr);      
    
    int  size() const  { return _matrix.size();             } 
    void resize(int n) { _matrix.resize(n, T_vector(n, 0)); }
    
private:
    T_matrix _matrix;
};
 
#endif


matrix.cpp
реализация
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
#include "matrix.hpp"
 
matrix::matrix() {}
 
matrix::matrix(int size)
{
    _matrix.resize(size, T_vector(size, 0));
}
 
const matrix matrix::operator-() 
{
    int sz = (*this).size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            _matrix[i][j] = -_matrix[i][j];
    return *this;
}
 
std::ostream& operator<<(std::ostream& stream, const matrix& matr)
{
    int sz = matr.size();
    for(int i = 0; i < sz; i++)
    {
        for(int j = 0; j < sz; j++)
            stream << matr._matrix[i][j] << " ";
        stream << std::endl;
    }
    return stream;
}
 
std::istream& operator>>(std::istream& stream, matrix& matr)
{
    int sz = matr.size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            stream >> matr._matrix[i][j];
    return stream;
}
 
matrix matrix::operator=(const matrix& matr)
{
    int sz = matr.size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++) 
            _matrix[i][j] = matr._matrix[i][j];
    return *this;
}
 
matrix matrix::operator+(const matrix& matr)
{
    int sz = (*this).size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            _matrix[i][j] += matr._matrix[i][j];
    return *this;
}
 
matrix matrix::operator-(const matrix& matr)
{
    int sz = (*this).size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            _matrix[i][j] += matr._matrix[i][j];
    return *this;
}
 
bool matrix::operator==(const matrix& m)
{
    int sz = (*this).size();
    for(int i = 0; i < sz; i++)
        for(int j = 0; j < sz; j++)
            if(m._matrix[i][j] != this->_matrix[i][j])
                return false;
    return true;
}
 
bool matrix::operator!=(const matrix& m)
{
    return !(*this == m);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2012, 17:08     матрица. клас
Посмотрите здесь:

клас обработчик C++
C++ Простой клас Student
C++ Векторы+клас
C++ матрица. клас. 2
переделать клас C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
12.02.2012, 22:43  [ТС]     матрица. клас #21
silent_1991,
Цитата Сообщение от silent_1991 Посмотреть сообщение
Mayonez, осли определён унарный оператор -.
Код
error: passing 'const matrix {aka const matrix}' as 'this' argument of 'const matrix matrix::operator-()'
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
12.02.2012, 22:52     матрица. клас #22
Цитата Сообщение от alex_x_x Посмотреть сообщение
кстати очень плохо, что не происходит проверки соответствия размерности матриц
я бы не рекомендовал. матрицы все-таки могут применяться для достаточно долгих и интенсивных вычислений. и проектировать подобные классы лучше исходя из этого. если нужны проверки, можно создать отдельные ф-ии.
з.ы. даже в стандартном vector доступ к элементу (используя []) проверка не производится, возможность проверки диапазона реализована в специальной ф-ии at
з.з.ы. valarray спроектирован и оптимизирован специально для мат. вычислений и вообще не подразумевает проверок
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.02.2012, 22:56     матрица. клас #23
retmas, если долгие и интенсивные вычисления - то одна проверка погоды не сделает
в том же самом фортране контроль размерностей встроен по дефолту (он уж точно предназначен для долгих и интенсивных вычислений)
первоначальный вариант ТС при несовпадении размеров вообще грозил бы крэшем программы
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
12.02.2012, 23:15     матрица. клас #24
alex_x_x, на счет одной проверки - сомнительно, что одной редко используемой.
тут вопрос скорее, что хочет автор от класса и какова главная цель: гибкость и универсальность или эффективность.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2012, 23:57     матрица. клас
Еще ссылки по теме:

C++ клас Letter, клас Person
C++ клас myDate
клас птиц C++

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
12.02.2012, 23:57     матрица. клас #25
Цитата Сообщение от Mayonez Посмотреть сообщение
нужно сделать не константным или есть другое решение?
Да, было бы неплохо возвращать новый объект по значению.
Цитата Сообщение от Mayonez Посмотреть сообщение
Сообщение от lemegeton
2. Напишите explicit перед конструктором с параметром.
не совсем понял...
Если не стоит explicit перед конструктором с одним параметром, такой конструктор может использоваться для приведения типа.
Например, станут возможными следующие не очевидные конструкции.
C++
1
2
matrix a = 2; // значение матрицы равно двум?! Будет приведено к matrix a(2).
matrix b = a + 2; // приведется к a + matrix(2), что может быть довольно неожиданно
Yandex
Объявления
12.02.2012, 23:57     матрица. клас
Ответ Создать тему
Опции темы

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