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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
#1

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

12.02.2012, 17:08. Просмотров 1436. Ответов 24
Метки нет (Все метки)

Решил создать класс квадратных матриц. Вот что получилось. Все работает, но хотелось бы услышать
Ваше мнение и любые(ВСЕ) замечания

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     матрица. клас
Посмотрите здесь:

матрица. клас. 2 - C++
в продолжение этой темы вот заголовочный файл: #pragma once #include &lt;vector&gt; #include &lt;iostream&gt; typedef...

клас Letter, клас Person - C++
Створити клас Letter, що мiстить наступнi елементи: - поле «вiдправник» Person*Sender; - поле «одержувач» Person*Receiver; - поле...

Векторы+клас - C++
Добрый вечер! Помогите пожалуйста кто-нибуть в написании или обьяснении создания програмы: Создать клас vector3D, какой задаеться троицей...

клас птиц - C++
Ребята помогите!!!!! 1)Создать консольный проект, в котором используется приведенный класс Student. Создать экземпляры этого класса и...

клас обработчик - C++
Написать класс обработчик исключительных ситуаций. Программа ловит ошибкуделения на нуль и выводитсообщение,вв какой части программы...

клас myDate - C++
Создайте класс Date, который будет содержать информацию о дате (день, месяц, год). С помощью механизма перегрузки операторов, определите...

переделать клас - C++
Всем привет! Надо немножко доработать етот код #include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; const int count = 5; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mayonez
380 / 272 / 21
Регистрация: 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
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
12.02.2012, 22:52     матрица. клас #22
Цитата Сообщение от alex_x_x Посмотреть сообщение
кстати очень плохо, что не происходит проверки соответствия размерности матриц
я бы не рекомендовал. матрицы все-таки могут применяться для достаточно долгих и интенсивных вычислений. и проектировать подобные классы лучше исходя из этого. если нужны проверки, можно создать отдельные ф-ии.
з.ы. даже в стандартном vector доступ к элементу (используя []) проверка не производится, возможность проверки диапазона реализована в специальной ф-ии at
з.з.ы. valarray спроектирован и оптимизирован специально для мат. вычислений и вообще не подразумевает проверок
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.02.2012, 22:56     матрица. клас #23
retmas, если долгие и интенсивные вычисления - то одна проверка погоды не сделает
в том же самом фортране контроль размерностей встроен по дефолту (он уж точно предназначен для долгих и интенсивных вычислений)
первоначальный вариант ТС при несовпадении размеров вообще грозил бы крэшем программы
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
12.02.2012, 23:15     матрица. клас #24
alex_x_x, на счет одной проверки - сомнительно, что одной редко используемой.
тут вопрос скорее, что хочет автор от класса и какова главная цель: гибкость и универсальность или эффективность.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2012, 23:57     матрица. клас
Еще ссылки по теме:

Простой клас Student - C++
Очень прошу помочь мне разобратся в следующем вопросе,который звучит так: Методами ООП С++ создать простой клас Student ,создать...

Клас многочлен наследствие - C++
Помогите пожалуйсто. Нужно унаследствовать клас многочлен. Что можна унаследствовать (какой клас можно сделать потомком)?

Клас колода карт - C++
Класс CardDeck (колода карт). Класс сохраняет массив из 32 карт (cards), а также текущую карту (currentCard). Надо написать функцию для...

создать клас HugeInt - C++
Описать класс, реализующий указанный ниже тип данных. Класс должен содержать множество конструкторов для создания объектов определенного...

как использовать клас в классе? - C++
Здравствуйте. Мне нужно, чтобы клас А использовад клас Б и наоборот. Упрощенный код: #ifndef... #include &quot;A.h&quot; class B { ...


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

Или воспользуйтесь поиском по форуму:
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
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     матрица. клас
Ответ Создать тему
Опции темы

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