Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Sylar9
135 / 56 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
1

Создание класса Матрица

21.04.2015, 13:18. Просмотров 878. Ответов 10
Метки нет (Все метки)

Не могу понять почему вылитает из программы
вот код
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>
using namespace std;
 
class Matrix
{
private:
    int **ptr, n, m;
public:
    Matrix(int, int);
    ~Matrix();
    Matrix operator+ (const Matrix&);
    friend ostream &operator << (ostream &cout, Matrix &temp);
};
//Констроктор
Matrix::Matrix(int a, int b) 
{
    n = a; m = b;
    ptr = new int*[n];
    for (int i = 0; i<n; i++)
        ptr[i] = new int[m];
}
 
//Деструктор
Matrix::~Matrix() 
{
    for (int i = 0; i<n; i++)
        delete[]ptr[i];
    delete[]ptr;
}
//Перегрузка оператора + 
Matrix Matrix::operator+(const Matrix &rhs)
{
    Matrix result(*this);
 
    for (size_t i = 0; i < n; ++i)
        for (size_t j = 0; j < m; ++j)
            result.ptr[i][j] += rhs.ptr[i][j];
 
    return result;
}
//Перегрузка <<
/*ostream &operator << (ostream &cout, Matrix &temp)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cout << temp.ptr[i][j] << " ";
        cout << endl;
    }
    return cout;
}*/
int main()
{
    Matrix m1(4, 4);
    Matrix m2(1, 1);
    Matrix m3();
    m3 = m2 + m1;
    return 0;
}
и чего-то не работает вывод cout <<
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2015, 13:18
Ответы с готовыми решениями:

Помогите найти ошибку с деструктором при создание класса Матрица
Возникла проблема с деструктором, во время выполнения. #include&lt;iomanip&gt; #include&lt;iostream&gt;...

Переопределение операторов, создание класса "Матрица"
Здравствуйте, нужна помощь, уже очень долго не могу понять в чём проблема. Создал класс матрица,...

Создание объекта класса с полем являющимся объектом другого класса
Bill a; cin&gt;&gt;a;//тут я ввел с помощью перегруженного оператора ElementSpiska c; //поля у...

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса -...

Возможно ли создание объекта шаблонного класса в функции этого класса?
Доброго времени суток, уважаемые форумчане :) Мне по лабам задали задание - реализовать шаблон...

10
zss
Модератор
Эксперт С++
8734 / 7644 / 4726
Регистрация: 18.12.2011
Сообщений: 20,334
Завершенные тесты: 1
21.04.2015, 13:23 2
1.
C++
1
2
3
4
5
6
7
8
9
10
ostream &operator << (ostream &os, Matrix &temp)
{
    for (int i = 0; i < temp.n; i++)
    {
        for (int j = 0; j < temp.m; j++)
            os << temp.ptr[i][j] << " ";
        os << endl;
    }
    return os;
}
2. НАРУШЕНО ПРАВИЛО ТРЕХ:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Matrix& Matrix::operator=(const Matrix& a) 
    {
        if(this!=&a)
        {
            for (int i = 0; i<n; i++)
                delete[]ptr[i];
            delete[]ptr;
            n = a.n; m = a.m;
            ptr = new int*[n];
            for (int i = 0; i<n; i++)
            {
                ptr[i] = new int[m];
                for (int j = 0; j<m; j++)
                    ptr[i][j]=a.ptr[i][j];
            }
        }
        return *this;
    }
3.
C++
1
2
    Matrix m3; // тут а) круглые скобки не нужны б) придется написать конструктор без параметров.
    m3 = m2 + m1;
4.
C++
1
Matrix():n(0),m(0),ptr(NULL){}//конструктор без параметров
5.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//Перегрузка оператора + 
Matrix Matrix::operator+(const Matrix &rhs)
{
   int m1=min(m,rhs.m);
   int n1=min(n,rhs.n);
    Matrix result(n1,m1);
 
    for (size_t i = 0; i < n1; ++i)
        for (size_t j = 0; j < m1; ++j)
            result.ptr[i][j] =ptr[i][j]+rhs.ptr[i][j];
 
    return result;
}
0
Sylar9
135 / 56 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
21.04.2015, 13:27  [ТС] 3
Первый код:
чего то такой бред выводит
Создание класса Матрица

не подскажите почему сложение не работает
0
Sylar9
135 / 56 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
21.04.2015, 14:03  [ТС] 4
C++
1
2
3
4
5
6
int main()
{
    Matrix m1(4, 4);
    cout << m1;
    return 0;
}
Добавлено через 35 минут
Помагите плиз
0
21.04.2015, 14:03
lss
931 / 860 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
21.04.2015, 14:04 5
Цитата Сообщение от Sylar9 Посмотреть сообщение
Помагите плиз
Покажи код, который пробуешь.
0
Sylar9
135 / 56 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
21.04.2015, 14:14  [ТС] 6
Цитата Сообщение от lss Посмотреть сообщение
Покажи код, который пробуешь.
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
#include <iostream>
using namespace std;
 
class Matrix
{
private:
    int **ptr, n, m;
public:
    Matrix(int, int);
    ~Matrix();
    void Fill();
    Matrix operator+ (const Matrix&);
    Matrix operator- (const Matrix&);
    friend ostream &operator << (ostream &os, Matrix &temp);
 
};
 
//Констроктор
Matrix::Matrix(int a, int b) 
{
    n = a; m = b;
    ptr = new int*[n];
    for (int i = 0; i<n; i++)
        ptr[i] = new int[m];
    Fill();
}
//Метод для заполение матрицы
void Matrix::Fill(){
    for (int i = 0; i<n; i++){
        for (int j = 0; j<m; j++){
            cout << "Enter [" << i << "][" << j << "] element of array: ";
            cin >> ptr[i][j];
        }
    }
}
//Деструктор
Matrix::~Matrix() 
{
    for (int i = 0; i<n; i++)
        delete[]ptr[i];
    delete[]ptr;
}
//Перегрузка оператора + 
Matrix Matrix::operator+(const Matrix &rhs)
{
    Matrix result(*this);
 
    for (size_t i = 0; i < n; ++i)
        for (size_t j = 0; j < m; ++j)
            result.ptr[i][j] += rhs.ptr[i][j];
 
    return result;
}
//Перегрузка оператора - 
Matrix Matrix::operator-(const Matrix &rhs)
{
    Matrix result(*this);
 
    for (size_t i = 0; i < n; ++i)
        for (size_t j = 0; j < m; ++j)
            result.ptr[i][j] -= rhs.ptr[i][j];
 
    return result;
}
 
//Перегрузка *
 
//Перегрузка <<
ostream &operator << (ostream &os, Matrix &temp)
{
    for (int i = 0; i < temp.n; i++)
    {
        for (int j = 0; j < temp.m; j++)
            os << temp.ptr[i][j] << " ";
        os << endl;
    }
    return os;
}
int main()
{
    Matrix m1(2, 2);
    cout << endl;
    cout << m1;
    return 0;
}
0
Zazy
45 / 45 / 23
Регистрация: 14.04.2013
Сообщений: 186
21.04.2015, 14:21 7
Sylar9, в методе сложение вы используете конструктор копирования а он у вас не определен, как уже упамяналось выше правило трех
0
zss
Модератор
Эксперт С++
8734 / 7644 / 4726
Регистрация: 18.12.2011
Сообщений: 20,334
Завершенные тесты: 1
21.04.2015, 14:22 8
Цитата Сообщение от Sylar9 Посмотреть сообщение
чего то такой бред выводит
А что Вы ожидали?
Разве что-нибудь элементам массива присваивалось?
0
Sylar9
135 / 56 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
21.04.2015, 14:34  [ТС] 9
Цитата Сообщение от zss Посмотреть сообщение
А что Вы ожидали?
Разве что-нибудь элементам массива присваивалось?
подскажите что я не правельно делаю

Добавлено через 22 секунды
что надо в коде поменять

Добавлено через 9 минут
что надо изменить в классе )
0
zss
Модератор
Эксперт С++
8734 / 7644 / 4726
Регистрация: 18.12.2011
Сообщений: 20,334
Завершенные тесты: 1
21.04.2015, 14:41 10
С учетом всех ошибок, вот такой код
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>
using namespace std;
 
class Matrix
{
private:
    int **ptr, n, m;
public:
    Matrix(int, int);
    Matrix(const Matrix& a);
    Matrix():n(0),m(0),ptr(NULL){}
    ~Matrix();
    Matrix& operator=(const Matrix& a); 
    void Fill();
    Matrix operator+(const Matrix&);
    friend ostream &operator << (ostream &cout, Matrix &temp);
};
//Заполение матрицы
void Matrix::Fill(){
    for (int i = 0; i<n; i++){
        for (int j = 0; j<m; j++){
            cout << "Enter [" << i << "][" << j << "] element of array: ";
            cin >> ptr[i][j];
        }
    }
}
//Конструктор
Matrix::Matrix(int a, int b) 
{
    n = a; m = b;
    ptr = new int*[n];
    for (int i = 0; i<n; i++)
        ptr[i] = new int[m];
}
 
//Копиконструктор
Matrix::Matrix(const Matrix& a)
{
    n = a.n; m = a.m;
    ptr = new int*[n];
    for (int i = 0; i<n; i++)
    {
        ptr[i] = new int[m];
        for (int j = 0; j<m; j++)
            ptr[i][j]=a.ptr[i][j];
    }
}
//Деструктор
Matrix::~Matrix() 
{
    for (int i = 0; i<n; i++)
        delete[]ptr[i];
    delete[]ptr;
}
// Наконец, operator= 
Matrix& Matrix::operator=(const Matrix& a) 
{
    if(this!=&a)
    {
        for (int i = 0; i<n; i++)
            delete[]ptr[i];
        delete[]ptr;
        n = a.n; m = a.m;
        ptr = new int*[n];
        for (int i = 0; i<n; i++)
        {
            ptr[i] = new int[m];
            for (int j = 0; j<m; j++)
                ptr[i][j]=a.ptr[i][j];
        }
    }
    return *this;
}
 
//Перегрузка оператора + 
Matrix Matrix::operator+(const Matrix &rhs)
{
    int m1=min(m,rhs.m);
    int n1=min(n,rhs.n);
    Matrix result(n1,m1);
 
    for (int i = 0; i < n1; ++i)
        for (int j = 0; j < m1; ++j)
            result.ptr[i][j] =ptr[i][j]+rhs.ptr[i][j];
    return result;
}
//Перегрузка <<
ostream &operator << (ostream &os, Matrix &temp)
{
    for (int i = 0; i < temp.n; i++)
    {
        for (int j = 0; j < temp.m; j++)
            os << temp.ptr[i][j] << " ";
        os << endl;
    }
    return os;
}
int main()
{
    Matrix m1(2,2);
    m1.Fill();
    Matrix m2(2,2);
    m2.Fill();
    Matrix m3;
    m3 = m2 + m1;
    cout<<m3;
    system("pause");
    return 0;
}
0
Sylar9
135 / 56 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
21.04.2015, 15:19  [ТС] 11
Цитата Сообщение от zss Посмотреть сообщение
С учетом всех ошибок, вот такой код
что то ругаеться Ошибка 1 error C3861: min: идентификатор не найден c:\users\lg\desktop\oop\oop\maincpp.cpp 78 1 OOP

Добавлено через 10 минут
Исправел теперь работает
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 <math.h>
using namespace std;
 
class Matrix
{
private:
    int **ptr, n, m;
public:
    Matrix(int, int);
    Matrix(const Matrix& a);
    Matrix() :n(0), m(0), ptr(NULL){}
    ~Matrix();
    Matrix& operator=(const Matrix& a);
    void Fill();
    Matrix operator+(const Matrix&);
    friend ostream &operator << (ostream &cout, Matrix &temp);
};
//Заполение матрицы
void Matrix::Fill(){
    for (int i = 0; i<n; i++){
        for (int j = 0; j<m; j++){
            cout << "Enter [" << i << "][" << j << "] element of array: ";
            cin >> ptr[i][j];
        }
    }
}
//Конструктор
Matrix::Matrix(int a, int b)
{
    n = a; m = b;
    ptr = new int*[n];
    for (int i = 0; i<n; i++)
        ptr[i] = new int[m];
}
 
//Копиконструктор
Matrix::Matrix(const Matrix& a)
{
    n = a.n; m = a.m;
    ptr = new int*[n];
    for (int i = 0; i<n; i++)
    {
        ptr[i] = new int[m];
        for (int j = 0; j<m; j++)
            ptr[i][j] = a.ptr[i][j];
    }
}
//Деструктор
Matrix::~Matrix()
{
    for (int i = 0; i<n; i++)
        delete[]ptr[i];
    delete[]ptr;
}
// Наконец, operator= 
Matrix& Matrix::operator=(const Matrix& a)
{
    if (this != &a)
    {
        for (int i = 0; i<n; i++)
            delete[]ptr[i];
        delete[]ptr;
        n = a.n; m = a.m;
        ptr = new int*[n];
        for (int i = 0; i<n; i++)
        {
            ptr[i] = new int[m];
            for (int j = 0; j<m; j++)
                ptr[i][j] = a.ptr[i][j];
        }
    }
    return *this;
}
 
//Перегрузка оператора + 
Matrix Matrix::operator+(const Matrix &rhs)
{
    /*int m1 = min(m, rhs.m);
    int n1 = min(n, rhs.n);*/
    int m1 = rhs.m;
    int n1 = rhs.n;
    Matrix result(n1, m1);
 
    for (int i = 0; i < n1; ++i)
        for (int j = 0; j < m1; ++j)
            result.ptr[i][j] = ptr[i][j] + rhs.ptr[i][j];
    return result;
}
//Перегрузка <<
ostream &operator << (ostream &os, Matrix &temp)
{
    for (int i = 0; i < temp.n; i++)
    {
        for (int j = 0; j < temp.m; j++)
            os << temp.ptr[i][j] << " ";
        os << endl;
    }
    return os;
}
int main()
{
    Matrix m1(2, 2);
    m1.Fill();
    Matrix m2(2, 2);
    m2.Fill();
    Matrix m3;
    m3 = m2 + m1;
    cout << m3;
    system("pause");
    return 0;
}
Добавлено через 4 минуты
а не подскажите как реализовать умножение и оператор ввода ?
0
21.04.2015, 15:19
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2015, 15:19

Явное создание экземпляра класса и явная специализация шаблона класса
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких...

Создание класса-списка на основе кода со списком без класса
Здравствуйте. Не могли бы вы показать, как оформить этот код в виде класса. Смысл задания: это...

Построение описания класса, создание и уничтожение объектов этого класса
Построить описание класса, содержащего информацию о почтовом адресе организации. Предусмотреть...


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

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

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